PostgreSQL Source Code git master
Loading...
Searching...
No Matches
psqlscan.l
Go to the documentation of this file.
1%top{
2/*-------------------------------------------------------------------------
3 *
4 * psqlscan.l
5 * lexical scanner for SQL commands
6 *
7 * This lexer used to be part of psql, and that heritage is reflected in
8 * the file name as well as function and typedef names, though it can now
9 * be used by other frontend programs as well. It's also possible to extend
10 * this lexer with a compatible add-on lexer to handle program-specific
11 * backslash commands.
12 *
13 * This code is mainly concerned with determining where the end of a SQL
14 * statement is: we are looking for semicolons that are not within quotes,
15 * comments, or parentheses. The most reliable way to handle this is to
16 * borrow the backend's flex lexer rules, lock, stock, and barrel. The rules
17 * below are (except for a few) the same as the backend's, but their actions
18 * are just ECHO whereas the backend's actions generally do other things.
19 *
20 * XXX The rules in this file must be kept in sync with the backend lexer!!!
21 *
22 * XXX Avoid creating backtracking cases --- see the backend lexer for info.
23 *
24 * See psqlscan_int.h for additional commentary.
25 *
26 *
27 * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
28 * Portions Copyright (c) 1994, Regents of the University of California
29 *
30 * IDENTIFICATION
31 * src/fe_utils/psqlscan.l
32 *
33 *-------------------------------------------------------------------------
34 */
35#include "postgres_fe.h"
36
37#include "common/logging.h"
38#include "fe_utils/psqlscan.h"
39
40#include "libpq-fe.h"
41}
42
43%{
44
45/* LCOV_EXCL_START */
46
48
49/*
50 * We must have a typedef YYSTYPE for yylex's first argument, but this lexer
51 * doesn't presently make use of that argument, so just declare it as int.
52 */
53typedef int YYSTYPE;
54
55
56/* Return values from yylex() */
57#define LEXRES_EOL 0 /* end of input */
58#define LEXRES_SEMI 1 /* command-terminating semicolon found */
59#define LEXRES_BACKSLASH 2 /* backslash command start */
60
61
62#define ECHO psqlscan_emit(cur_state, yytext, yyleng)
63
int YYSTYPE
Definition psqlscan.l:53
64%}
65
66%option reentrant
67%option bison-bridge
68%option 8bit
69%option never-interactive
70%option nodefault
71%option noinput
72%option nounput
73%option noyywrap
74%option warn
75%option prefix="psql_yy"
76
77/*
78 * Set the type of yyextra; we use it as a pointer back to the containing
79 * PsqlScanState.
80 */
81%option extra-type="PsqlScanState"
82
83/*
84 * All of the following definitions and rules should exactly match
85 * src/backend/parser/scan.l so far as the flex patterns are concerned.
86 * The rule bodies are just ECHO as opposed to what the backend does,
87 * however. (But be sure to duplicate code that affects the lexing process,
88 * such as BEGIN() and yyless().) Also, psqlscan uses a single <<EOF>> rule
89 * whereas scan.l has a separate one for each exclusive state.
90 */
91
92/*
93 * OK, here is a short description of lex/flex rules behavior.
94 * The longest pattern which matches an input string is always chosen.
95 * For equal-length patterns, the first occurring in the rules list is chosen.
96 * INITIAL is the starting state, to which all non-conditional rules apply.
97 * Exclusive states change parsing rules while the state is active. When in
98 * an exclusive state, only those rules defined for that state apply.
99 *
100 * We use exclusive states for quoted strings, extended comments,
101 * and to eliminate parsing troubles for numeric strings.
102 * Exclusive states:
103 * <xb> bit string literal
104 * <xc> extended C-style comments
105 * <xd> delimited identifiers (double-quoted identifiers)
106 * <xh> hexadecimal byte string
107 * <xq> standard quoted strings
108 * <xqs> quote stop (detect continued strings)
109 * <xe> extended quoted strings (support backslash escape sequences)
110 * <xdolq> $foo$ quoted strings
111 * <xui> quoted identifier with Unicode escapes
112 * <xus> quoted string with Unicode escapes
113 *
114 * Note: we intentionally don't mimic the backend's <xeu> state; we have
115 * no need to distinguish it from <xe> state, and no good way to get out
116 * of it in error cases. The backend just throws yyerror() in those
117 * cases, but that's not an option here.
118 */
119
120%x xb
121%x xc
122%x xd
123%x xh
124%x xq
125%x xqs
126%x xe
127%x xdolq
128%x xui
129%x xus
130
131/*
132 * In order to make the world safe for Windows and Mac clients as well as
133 * Unix ones, we accept either \n or \r as a newline. A DOS-style \r\n
134 * sequence will be seen as two successive newlines, but that doesn't cause
135 * any problems. Comments that start with -- and extend to the next
136 * newline are treated as equivalent to a single whitespace character.
137 *
138 * NOTE a fine point: if there is no newline following --, we will absorb
139 * everything to the end of the input as a comment. This is correct. Older
140 * versions of Postgres failed to recognize -- as a comment if the input
141 * did not end with a newline.
142 *
143 * non_newline_space tracks all space characters except newlines.
144 *
145 * XXX if you change the set of whitespace characters, fix scanner_isspace()
146 * to agree.
147 */
148
149space [ \t\n\r\f\v]
150non_newline_space [ \t\f\v]
151newline [\n\r]
152non_newline [^\n\r]
153
154comment ("--"{non_newline}*)
155
156whitespace ({space}+|{comment})
157
158/*
159 * SQL requires at least one newline in the whitespace separating
160 * string literals that are to be concatenated. Silly, but who are we
161 * to argue? Note that {whitespace_with_newline} should not have * after
162 * it, whereas {whitespace} should generally have a * after it...
163 */
164
165special_whitespace ({space}+|{comment}{newline})
166non_newline_whitespace ({non_newline_space}|{comment})
167whitespace_with_newline ({non_newline_whitespace}*{newline}{special_whitespace}*)
168
169quote '
170/* If we see {quote} then {quotecontinue}, the quoted string continues */
171quotecontinue {whitespace_with_newline}{quote}
172
173/*
174 * {quotecontinuefail} is needed to avoid lexer backup when we fail to match
175 * {quotecontinue}. It might seem that this could just be {whitespace}*,
176 * but if there's a dash after {whitespace_with_newline}, it must be consumed
177 * to see if there's another dash --- which would start a {comment} and thus
178 * allow continuation of the {quotecontinue} token.
179 */
180quotecontinuefail {whitespace}*"-"?
181
182/* Bit string
183 * It is tempting to scan the string for only those characters
184 * which are allowed. However, this leads to silently swallowed
185 * characters if illegal characters are included in the string.
186 * For example, if xbinside is [01] then B'ABCD' is interpreted
187 * as a zero-length string, and the ABCD' is lost!
188 * Better to pass the string forward and let the input routines
189 * validate the contents.
190 */
191xbstart [bB]{quote}
192xbinside [^']*
193
194/* Hexadecimal byte string */
195xhstart [xX]{quote}
196xhinside [^']*
197
198/* National character */
199xnstart [nN]{quote}
200
201/* Quoted string that allows backslash escapes */
202xestart [eE]{quote}
203xeinside [^\\']+
204xeescape [\\][^0-7]
205xeoctesc [\\][0-7]{1,3}
206xehexesc [\\]x[0-9A-Fa-f]{1,2}
207xeunicode [\\](u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})
208xeunicodefail [\\](u[0-9A-Fa-f]{0,3}|U[0-9A-Fa-f]{0,7})
209
210/* Extended quote
211 * xqdouble implements embedded quote, ''''
212 */
213xqstart {quote}
214xqdouble {quote}{quote}
215xqinside [^']+
216
217/* $foo$ style quotes ("dollar quoting")
218 * The quoted string starts with $foo$ where "foo" is an optional string
219 * in the form of an identifier, except that it may not contain "$",
220 * and extends to the first occurrence of an identical string.
221 * There is *no* processing of the quoted text.
222 *
223 * {dolqfailed} is an error rule to avoid scanner backup when {dolqdelim}
224 * fails to match its trailing "$".
225 */
226dolq_start [A-Za-z\200-\377_]
227dolq_cont [A-Za-z\200-\377_0-9]
228dolqdelim \$({dolq_start}{dolq_cont}*)?\$
229dolqfailed \${dolq_start}{dolq_cont}*
230dolqinside [^$]+
231
232/* Double quote
233 * Allows embedded spaces and other special characters into identifiers.
234 */
235dquote \"
236xdstart {dquote}
237xdstop {dquote}
238xddouble {dquote}{dquote}
239xdinside [^"]+
240
241/* Quoted identifier with Unicode escapes */
242xuistart [uU]&{dquote}
243
244/* Quoted string with Unicode escapes */
245xusstart [uU]&{quote}
246
247/* error rule to avoid backup */
248xufailed [uU]&
249
250
251/* C-style comments
252 *
253 * The "extended comment" syntax closely resembles allowable operator syntax.
254 * The tricky part here is to get lex to recognize a string starting with
255 * slash-star as a comment, when interpreting it as an operator would produce
256 * a longer match --- remember lex will prefer a longer match! Also, if we
257 * have something like plus-slash-star, lex will think this is a 3-character
258 * operator whereas we want to see it as a + operator and a comment start.
259 * The solution is two-fold:
260 * 1. append {op_chars}* to xcstart so that it matches as much text as
261 * {operator} would. Then the tie-breaker (first matching rule of same
262 * length) ensures xcstart wins. We put back the extra stuff with yyless()
263 * in case it contains a star-slash that should terminate the comment.
264 * 2. In the operator rule, check for slash-star within the operator, and
265 * if found throw it back with yyless(). This handles the plus-slash-star
266 * problem.
267 * Dash-dash comments have similar interactions with the operator rule.
268 */
269xcstart \/\*{op_chars}*
270xcstop \*+\/
271xcinside [^*/]+
272
273ident_start [A-Za-z\200-\377_]
274ident_cont [A-Za-z\200-\377_0-9\$]
275
276identifier {ident_start}{ident_cont}*
277
278/* Assorted special-case operators and operator-like tokens */
279typecast "::"
280dot_dot \.\.
281colon_equals ":="
282
283/*
284 * These operator-like tokens (unlike the above ones) also match the {operator}
285 * rule, which means that they might be overridden by a longer match if they
286 * are followed by a comment start or a + or - character. Accordingly, if you
287 * add to this list, you must also add corresponding code to the {operator}
288 * block to return the correct token in such cases. (This is not needed in
289 * psqlscan.l since the token value is ignored there.)
290 */
291equals_greater "=>"
292less_equals "<="
293greater_equals ">="
294less_greater "<>"
295not_equals "!="
296/* Note there is no need for left_arrow, since "<-" is not a single operator. */
297right_arrow "->"
298
299/*
300 * "self" is the set of chars that should be returned as single-character
301 * tokens. "op_chars" is the set of chars that can make up "Op" tokens,
302 * which can be one or more characters long (but if a single-char token
303 * appears in the "self" set, it is not to be returned as an Op). Note
304 * that the sets overlap, but each has some chars that are not in the other.
305 *
306 * If you change either set, adjust the character lists appearing in the
307 * rule for "operator"!
308 */
309self [,()\[\].;\:\|\+\-\*\/\%\^<>\=]
310op_chars [\~\!\@\#\^\&\|\`\?\+\-\*\/\%<>\=]
311operator {op_chars}+
312
313/*
314 * Numbers
315 *
316 * Unary minus is not part of a number here. Instead we pass it separately to
317 * the parser, and there it gets coerced via doNegate().
318 *
319 * {numericfail} is used because we would like "1..10" to lex as 1, dot_dot, 10.
320 *
321 * {realfail} is added to prevent the need for scanner
322 * backup when the {real} rule fails to match completely.
323 */
324decdigit [0-9]
325hexdigit [0-9A-Fa-f]
326octdigit [0-7]
327bindigit [0-1]
328
329decinteger {decdigit}(_?{decdigit})*
330hexinteger 0[xX](_?{hexdigit})+
331octinteger 0[oO](_?{octdigit})+
332bininteger 0[bB](_?{bindigit})+
333
334hexfail 0[xX]_?
335octfail 0[oO]_?
336binfail 0[bB]_?
337
338numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
339numericfail {decinteger}\.\.
340
341real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
342realfail ({decinteger}|{numeric})[Ee][-+]
343
344/* Positional parameters don't accept underscores. */
345param \${decdigit}+
346
347/*
348 * An identifier immediately following an integer literal is disallowed because
349 * in some cases it's ambiguous what is meant: for example, 0x1234 could be
350 * either a hexinteger or a decinteger "0" and an identifier "x1234". We can
351 * detect such problems by seeing if integer_junk matches a longer substring
352 * than any of the XXXinteger patterns (decinteger, hexinteger, octinteger,
353 * bininteger). One "junk" pattern is sufficient because
354 * {decinteger}{identifier} will match all the same strings we'd match with
355 * {hexinteger}{identifier} etc.
356 *
357 * Note that the rule for integer_junk must appear after the ones for
358 * XXXinteger to make this work correctly: 0x1234 will match both hexinteger
359 * and integer_junk, and we need hexinteger to be chosen in that case.
360 *
361 * Also disallow strings matched by numeric_junk, real_junk and param_junk
362 * for consistency.
363 */
364integer_junk {decinteger}{identifier}
365numeric_junk {numeric}{identifier}
366real_junk {real}{identifier}
367param_junk \${decdigit}+{identifier}
368
369/* psql-specific: characters allowed in variable names */
370variable_char [A-Za-z\200-\377_0-9]
371
372other .
373
374/*
375 * Dollar quoted strings are totally opaque, and no escaping is done on them.
376 * Other quoted strings must allow some special characters such as single-quote
377 * and newline.
378 * Embedded single-quotes are implemented both in the SQL standard
379 * style of two adjacent single quotes "''" and in the Postgres/Java style
380 * of escaped-quote "\'".
381 * Other embedded escaped characters are matched explicitly and the leading
382 * backslash is dropped from the string.
383 * Note that xcstart must appear before operator, as explained above!
384 * Also whitespace (comment) must appear before operator.
385 */
386
388
389%{
390 /* Declare some local variables inside yylex(), for convenience */
391 PsqlScanState cur_state = yyextra;
static int fb(int x)
#define yyextra
Definition scan.l:1102
392 PQExpBuffer output_buf = cur_state->output_buf;
393
394 /*
395 * Force flex into the state indicated by start_state. This has a
396 * couple of purposes: it lets some of the functions below set a new
397 * starting state without ugly direct access to flex variables, and it
398 * allows us to transition from one flex lexer to another so that we
399 * can lex different parts of the source string using separate lexers.
400 */
401 BEGIN(cur_state->start_state);
402%}
403
404{whitespace} {
405 /*
406 * Note that the whitespace rule includes both true
407 * whitespace and single-line ("--" style) comments.
408 * We suppress whitespace until we have collected some
409 * non-whitespace data. (This interacts with some
410 * decisions in MainLoop(); see there for details.)
411 */
412 if (output_buf->len > 0)
413 ECHO;
414 }
#define ECHO
Definition psqlscan.l:62
415
416{xcstart} {
417 cur_state->xcdepth = 0;
418 BEGIN(xc);
419 /* Put back any characters past slash-star; see above */
420 yyless(2);
421 ECHO;
422 }
423
424<xc>{
425{xcstart} {
426 cur_state->xcdepth++;
427 /* Put back any characters past slash-star; see above */
428 yyless(2);
429 ECHO;
430 }
431
432{xcstop} {
433 if (cur_state->xcdepth <= 0)
434 BEGIN(INITIAL);
435 else
436 cur_state->xcdepth--;
437 ECHO;
438 }
439
440{xcinside} {
441 ECHO;
442 }
443
444{op_chars} {
445 ECHO;
446 }
447
448\*+ {
449 ECHO;
450 }
451} /* <xc> */
452
453{xbstart} {
454 BEGIN(xb);
455 ECHO;
456 }
457<xh>{xhinside} |
458<xb>{xbinside} {
459 ECHO;
460 }
461
462{xhstart} {
463 /* Hexadecimal bit type.
464 * At some point we should simply pass the string
465 * forward to the parser and label it there.
466 * In the meantime, place a leading "x" on the string
467 * to mark it for the input routine as a hex string.
468 */
469 BEGIN(xh);
470 ECHO;
471 }
472
473{xnstart} {
474 yyless(1); /* eat only 'n' this time */
475 ECHO;
476 }
477
478{xqstart} {
479 if (cur_state->std_strings)
480 BEGIN(xq);
481 else
482 BEGIN(xe);
483 ECHO;
484 }
485{xestart} {
486 BEGIN(xe);
487 ECHO;
488 }
489{xusstart} {
490 BEGIN(xus);
491 ECHO;
492 }
493
494<xb,xh,xq,xe,xus>{quote} {
495 /*
496 * When we are scanning a quoted string and see an end
497 * quote, we must look ahead for a possible continuation.
498 * If we don't see one, we know the end quote was in fact
499 * the end of the string. To reduce the lexer table size,
500 * we use a single "xqs" state to do the lookahead for all
501 * types of strings.
502 */
503 cur_state->state_before_str_stop = YYSTATE;
504 BEGIN(xqs);
505 ECHO;
506 }
507<xqs>{quotecontinue} {
508 /*
509 * Found a quote continuation, so return to the in-quote
510 * state and continue scanning the literal. Nothing is
511 * added to the literal's contents.
512 */
513 BEGIN(cur_state->state_before_str_stop);
514 ECHO;
515 }
516<xqs>{quotecontinuefail} |
517<xqs>{other} {
518 /*
519 * Failed to see a quote continuation. Throw back
520 * everything after the end quote, and handle the string
521 * according to the state we were in previously.
522 */
523 yyless(0);
524 BEGIN(INITIAL);
525 /* There's nothing to echo ... */
526 }
527
528<xq,xe,xus>{xqdouble} {
529 ECHO;
530 }
531<xq,xus>{xqinside} {
532 ECHO;
533 }
534<xe>{xeinside} {
535 ECHO;
536 }
537<xe>{xeunicode} {
538 ECHO;
539 }
540<xe>{xeunicodefail} {
541 ECHO;
542 }
543<xe>{xeescape} {
544 ECHO;
545 }
546<xe>{xeoctesc} {
547 ECHO;
548 }
549<xe>{xehexesc} {
550 ECHO;
551 }
552<xe>. {
553 /* This is only needed for \ just before EOF */
554 ECHO;
555 }
556
557{dolqdelim} {
558 cur_state->dolqstart = pg_strdup(yytext);
559 BEGIN(xdolq);
560 ECHO;
561 }
char * pg_strdup(const char *in)
Definition fe_memutils.c:85
562{dolqfailed} {
563 /* throw back all but the initial "$" */
564 yyless(1);
565 ECHO;
566 }
567<xdolq>{dolqdelim} {
568 if (strcmp(yytext, cur_state->dolqstart) == 0)
569 {
570 free(cur_state->dolqstart);
571 cur_state->dolqstart = NULL;
572 BEGIN(INITIAL);
573 }
574 else
575 {
576 /*
577 * When we fail to match $...$ to dolqstart, transfer
578 * the $... part to the output, but put back the final
579 * $ for rescanning. Consider $delim$...$junk$delim$
580 */
581 yyless(yyleng - 1);
582 }
583 ECHO;
584 }
#define yyleng
Definition scan.l:1108
#define free(a)
585<xdolq>{dolqinside} {
586 ECHO;
587 }
588<xdolq>{dolqfailed} {
589 ECHO;
590 }
591<xdolq>. {
592 /* This is only needed for $ inside the quoted text */
593 ECHO;
594 }
595
596{xdstart} {
597 BEGIN(xd);
598 ECHO;
599 }
600{xuistart} {
601 BEGIN(xui);
602 ECHO;
603 }
604<xd>{xdstop} {
605 BEGIN(INITIAL);
606 ECHO;
607 }
608<xui>{dquote} {
609 BEGIN(INITIAL);
610 ECHO;
611 }
612<xd,xui>{xddouble} {
613 ECHO;
614 }
615<xd,xui>{xdinside} {
616 ECHO;
617 }
618
619{xufailed} {
620 /* throw back all but the initial u/U */
621 yyless(1);
622 ECHO;
623 }
624
625{typecast} {
626 ECHO;
627 }
628
629{dot_dot} {
630 ECHO;
631 }
632
633{colon_equals} {
634 ECHO;
635 }
636
637{equals_greater} {
638 ECHO;
639 }
640
641{less_equals} {
642 ECHO;
643 }
644
645{greater_equals} {
646 ECHO;
647 }
648
649{less_greater} {
650 ECHO;
651 }
652
653{not_equals} {
654 ECHO;
655 }
656
657{right_arrow} {
658 ECHO;
659 }
660
661 /*
662 * These rules are specific to psql --- they implement parenthesis
663 * counting and detection of command-ending semicolon. These must
664 * appear before the {self} rule so that they take precedence over it.
665 */
666
667"(" {
668 cur_state->paren_depth++;
669 ECHO;
670 }
671
672")" {
673 if (cur_state->paren_depth > 0)
674 cur_state->paren_depth--;
675 ECHO;
676 }
677
678";" {
679 ECHO;
680 if (cur_state->paren_depth == 0 && cur_state->begin_depth == 0)
681 {
682 /* Terminate lexing temporarily */
683 cur_state->start_state = YY_START;
684 cur_state->identifier_count = 0;
685 return LEXRES_SEMI;
686 }
687 }
#define LEXRES_SEMI
Definition psqlscan.l:58
688
689 /*
690 * psql-specific rules to handle backslash commands and variable
691 * substitution. We want these before {self}, also.
692 */
693
694"\\"[;:] {
695 /* Force a semi-colon or colon into the query buffer */
697 if (yytext[1] == ';')
698 cur_state->identifier_count = 0;
699 }
void psqlscan_emit(PsqlScanState state, const char *txt, int len)
Definition psqlscan.l:1523
700
701"\\" {
702 /* Terminate lexing temporarily */
703 cur_state->start_state = YY_START;
704 return LEXRES_BACKSLASH;
705 }
#define LEXRES_BACKSLASH
Definition psqlscan.l:59
706
707:{variable_char}+ {
708 /* Possible psql variable substitution */
709 char *varname;
710 char *value;
711
713 yytext + 1,
714 yyleng - 1);
715 if (cur_state->callbacks->get_variable)
716 value = cur_state->callbacks->get_variable(varname,
718 cur_state->cb_passthrough);
719 else
720 value = NULL;
721
722 if (value)
723 {
724 /* It is a variable, check for recursion */
726 {
727 /* Recursive expansion --- don't go there */
728 pg_log_warning("skipping recursive expansion of variable \"%s\"",
729 varname);
730 /* Instead copy the string as is */
731 ECHO;
732 }
733 else
734 {
735 /* OK, perform substitution */
737 /* yy_scan_string already made buffer active */
738 }
739 free(value);
740 }
741 else
742 {
743 /*
744 * if the variable doesn't exist we'll copy the string
745 * as is
746 */
747 ECHO;
748 }
749
750 free(varname);
751 }
static struct @174 value
#define pg_log_warning(...)
Definition pgfnames.c:24
@ PQUOTE_PLAIN
Definition psqlscan.h:54
char * psqlscan_extract_substring(PsqlScanState state, const char *txt, int len)
Definition psqlscan.l:1555
void psqlscan_push_new_buffer(PsqlScanState state, const char *newstr, const char *varname)
Definition psqlscan.l:1380
bool psqlscan_var_is_current_source(PsqlScanState state, const char *varname)
Definition psqlscan.l:1460
752
753:'{variable_char}+' {
756 }
@ PQUOTE_SQL_LITERAL
Definition psqlscan.h:55
void psqlscan_escape_variable(PsqlScanState state, const char *txt, int len, PsqlScanQuoteType quote)
Definition psqlscan.l:1591
757
758:\"{variable_char}+\" {
761 }
@ PQUOTE_SQL_IDENT
Definition psqlscan.h:56
762
763:\{\?{variable_char}+\} {
765 }
void psqlscan_test_variable(PsqlScanState state, const char *txt, int len)
Definition psqlscan.l:1620
766
767 /*
768 * These rules just avoid the need for scanner backup if one of the
769 * three rules above fails to match completely.
770 */
771
772:'{variable_char}* {
773 /* Throw back everything but the colon */
774 yyless(1);
775 ECHO;
776 }
777
778:\"{variable_char}* {
779 /* Throw back everything but the colon */
780 yyless(1);
781 ECHO;
782 }
783
784:\{\?{variable_char}* {
785 /* Throw back everything but the colon */
786 yyless(1);
787 ECHO;
788 }
789:\{ {
790 /* Throw back everything but the colon */
791 yyless(1);
792 ECHO;
793 }
794
795 /*
796 * Back to backend-compatible rules.
797 */
798
799{self} {
800 ECHO;
801 }
802
803{operator} {
804 /*
805 * Check for embedded slash-star or dash-dash; those
806 * are comment starts, so operator must stop there.
807 * Note that slash-star or dash-dash at the first
808 * character will match a prior rule, not this one.
809 */
810 int nchars = yyleng;
811 char *slashstar = strstr(yytext, "/*");
812 char *dashdash = strstr(yytext, "--");
813
814 if (slashstar && dashdash)
815 {
816 /* if both appear, take the first one */
817 if (slashstar > dashdash)
819 }
820 else if (!slashstar)
822 if (slashstar)
823 nchars = slashstar - yytext;
824
825 /*
826 * For SQL compatibility, '+' and '-' cannot be the
827 * last char of a multi-char operator unless the operator
828 * contains chars that are not in SQL operators.
829 * The idea is to lex '=-' as two operators, but not
830 * to forbid operator names like '?-' that could not be
831 * sequences of SQL operators.
832 */
833 if (nchars > 1 &&
834 (yytext[nchars - 1] == '+' ||
835 yytext[nchars - 1] == '-'))
836 {
837 int ic;
838
839 for (ic = nchars - 2; ic >= 0; ic--)
840 {
841 char c = yytext[ic];
842 if (c == '~' || c == '!' || c == '@' ||
843 c == '#' || c == '^' || c == '&' ||
844 c == '|' || c == '`' || c == '?' ||
845 c == '%')
846 break;
847 }
848 if (ic < 0)
849 {
850 /*
851 * didn't find a qualifying character, so remove
852 * all trailing [+-]
853 */
854 do {
855 nchars--;
856 } while (nchars > 1 &&
857 (yytext[nchars - 1] == '+' ||
858 yytext[nchars - 1] == '-'));
859 }
860 }
861
862 if (nchars < yyleng)
863 {
864 /* Strip the unwanted chars from the token */
865 yyless(nchars);
866 }
867 ECHO;
868 }
char * c
869
870{param} {
871 ECHO;
872 }
873{param_junk} {
874 ECHO;
875 }
876
877{decinteger} {
878 ECHO;
879 }
880{hexinteger} {
881 ECHO;
882 }
883{octinteger} {
884 ECHO;
885 }
886{bininteger} {
887 ECHO;
888 }
889{hexfail} {
890 ECHO;
891 }
892{octfail} {
893 ECHO;
894 }
895{binfail} {
896 ECHO;
897 }
898{numeric} {
899 ECHO;
900 }
901{numericfail} {
902 /* throw back the .., and treat as integer */
903 yyless(yyleng - 2);
904 ECHO;
905 }
906{real} {
907 ECHO;
908 }
909{realfail} {
910 ECHO;
911 }
912{integer_junk} {
913 ECHO;
914 }
915{numeric_junk} {
916 ECHO;
917 }
918{real_junk} {
919 ECHO;
920 }
921
922
923{identifier} {
924 /*
925 * We need to track if we are inside a BEGIN .. END block
926 * in a function definition, so that semicolons contained
927 * therein don't terminate the whole statement. Short of
928 * writing a full parser here, the following heuristic
929 * should work. First, we track whether the beginning of
930 * the statement matches CREATE [OR REPLACE]
931 * {FUNCTION|PROCEDURE}
932 */
933
934 if (cur_state->identifier_count == 0)
935 memset(cur_state->identifiers, 0, sizeof(cur_state->identifiers));
936
937 if (pg_strcasecmp(yytext, "create") == 0 ||
938 pg_strcasecmp(yytext, "function") == 0 ||
939 pg_strcasecmp(yytext, "procedure") == 0 ||
940 pg_strcasecmp(yytext, "or") == 0 ||
941 pg_strcasecmp(yytext, "replace") == 0)
942 {
943 if (cur_state->identifier_count < sizeof(cur_state->identifiers))
944 cur_state->identifiers[cur_state->identifier_count] = pg_tolower((unsigned char) yytext[0]);
945 }
946
947 cur_state->identifier_count++;
948
949 if (cur_state->identifiers[0] == 'c' &&
950 (cur_state->identifiers[1] == 'f' || cur_state->identifiers[1] == 'p' ||
951 (cur_state->identifiers[1] == 'o' && cur_state->identifiers[2] == 'r' &&
952 (cur_state->identifiers[3] == 'f' || cur_state->identifiers[3] == 'p'))) &&
953 cur_state->paren_depth == 0)
954 {
955 if (pg_strcasecmp(yytext, "begin") == 0)
956 cur_state->begin_depth++;
957 else if (pg_strcasecmp(yytext, "case") == 0)
958 {
959 /*
960 * CASE also ends with END. We only need to track
961 * this if we are already inside a BEGIN.
962 */
963 if (cur_state->begin_depth >= 1)
964 cur_state->begin_depth++;
965 }
966 else if (pg_strcasecmp(yytext, "end") == 0)
967 {
968 if (cur_state->begin_depth > 0)
969 cur_state->begin_depth--;
970 }
971 }
972
973 ECHO;
974 }
int pg_strcasecmp(const char *s1, const char *s2)
unsigned char pg_tolower(unsigned char ch)
975
976{other} {
977 ECHO;
978 }
979
980<<EOF>> {
981 if (cur_state->buffer_stack == NULL)
982 {
983 cur_state->start_state = YY_START;
984 return LEXRES_EOL; /* end of input reached */
985 }
986
987 /*
988 * We were expanding a variable, so pop the inclusion
989 * stack and keep lexing
990 */
993 }
void psqlscan_select_top_buffer(PsqlScanState state)
Definition psqlscan.l:1437
#define LEXRES_EOL
Definition psqlscan.l:57
void psqlscan_pop_buffer_stack(PsqlScanState state)
Definition psqlscan.l:1419
994
995%%
996
997/* LCOV_EXCL_STOP */
998
999/*
1000 * Create a lexer working state struct.
1001 *
1002 * callbacks is a struct of function pointers that encapsulate some
1003 * behavior we need from the surrounding program. This struct must
1004 * remain valid for the lifespan of the PsqlScanState.
1005 */
1008{
1010
1012
1013 state->callbacks = callbacks;
1014
1015 yylex_init(&state->scanner);
1016
1017 yyset_extra(state, state->scanner);
1018
1020
1021 return state;
1022}
1023
1024/*
1025 * Destroy a lexer working state struct, releasing all resources.
1026 */
1027void
1029{
1031
1033
1034 yylex_destroy(state->scanner);
1035
1036 free(state);
1037}
1038
1039/*
1040 * Set the callback passthrough pointer for the lexer.
1041 *
1042 * This could have been integrated into psql_scan_create, but keeping it
1043 * separate allows the application to change the pointer later, which might
1044 * be useful.
1045 */
1046void
1048{
1049 state->cb_passthrough = passthrough;
1050}
1051
1052/*
1053 * Set up to perform lexing of the given input line.
1054 *
1055 * The text at *line, extending for line_len bytes, will be scanned by
1056 * subsequent calls to the psql_scan routines. psql_scan_finish should
1057 * be called when scanning is complete. Note that the lexer retains
1058 * a pointer to the storage at *line --- this string must not be altered
1059 * or freed until after psql_scan_finish is called.
1060 *
1061 * encoding is the libpq identifier for the character encoding in use,
1062 * and std_strings says whether standard_conforming_strings is on.
1063 */
1064void
1066 const char *line, int line_len,
1067 int encoding, bool std_strings)
1068{
1069 /* Mustn't be scanning already */
1070 Assert(state->scanbufhandle == NULL);
1071 Assert(state->buffer_stack == NULL);
1072
1073 /* Do we need to hack the character set encoding? */
1074 state->encoding = encoding;
1075 state->safe_encoding = pg_valid_server_encoding_id(encoding);
1076
1077 /* Save standard-strings flag as well */
1078 state->std_strings = std_strings;
1079
1080 /* Set up flex input buffer with appropriate translation and padding */
1081 state->scanbufhandle = psqlscan_prepare_buffer(state, line, line_len,
1082 &state->scanbuf);
1083 state->scanline = line;
1084
1085 /* Set lookaside data in case we have to map unsafe encoding */
1086 state->curline = state->scanbuf;
1087 state->refline = state->scanline;
1088
1089 /* Initialize state for psql_scan_get_location() */
1090 state->cur_line_no = 0; /* yylex not called yet */
1091 state->cur_line_ptr = state->scanbuf;
1092}
1093
1094/*
1095 * Do lexical analysis of SQL command text.
1096 *
1097 * The text previously passed to psql_scan_setup is scanned, and appended
1098 * (possibly with transformation) to query_buf.
1099 *
1100 * The return value indicates the condition that stopped scanning:
1101 *
1102 * PSCAN_SEMICOLON: found a command-ending semicolon. (The semicolon is
1103 * transferred to query_buf.) The command accumulated in query_buf should
1104 * be executed, then clear query_buf and call again to scan the remainder
1105 * of the line.
1106 *
1107 * PSCAN_BACKSLASH: found a backslash that starts a special command.
1108 * Any previous data on the line has been transferred to query_buf.
1109 * The caller will typically next apply a separate flex lexer to scan
1110 * the special command.
1111 *
1112 * PSCAN_INCOMPLETE: the end of the line was reached, but we have an
1113 * incomplete SQL command. *prompt is set to the appropriate prompt type.
1114 *
1115 * PSCAN_EOL: the end of the line was reached, and there is no lexical
1116 * reason to consider the command incomplete. The caller may or may not
1117 * choose to send it. *prompt is set to the appropriate prompt type if
1118 * the caller chooses to collect more input.
1119 *
1120 * In the PSCAN_INCOMPLETE and PSCAN_EOL cases, psql_scan_finish() should
1121 * be called next, then the cycle may be repeated with a fresh input line.
1122 *
1123 * In all cases, *prompt is set to an appropriate prompt type code for the
1124 * next line-input operation.
1125 */
1130{
1131 PsqlScanResult result;
1132 int lexresult;
1133
1134 /* Must be scanning already */
1135 Assert(state->scanbufhandle != NULL);
1136
1137 /* Set current output target */
1138 state->output_buf = query_buf;
1139
1140 /* Set input source */
1141 if (state->buffer_stack != NULL)
1142 yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
1143 else
1144 yy_switch_to_buffer(state->scanbufhandle, state->scanner);
1145
1146 /* And lex. */
1147 lexresult = yylex(NULL, state->scanner);
1148
1149 /* Notify psql_scan_get_location() that a yylex call has been made. */
1150 if (state->cur_line_no == 0)
1151 state->cur_line_no = 1;
1152
1153 /*
1154 * Check termination state and return appropriate result info.
1155 */
1156 switch (lexresult)
1157 {
1158 case LEXRES_EOL: /* end of input */
1159 switch (state->start_state)
1160 {
1161 case INITIAL:
1162 case xqs: /* we treat this like INITIAL */
1163 if (state->paren_depth > 0)
1164 {
1165 result = PSCAN_INCOMPLETE;
1167 }
1168 else if (state->begin_depth > 0)
1169 {
1170 result = PSCAN_INCOMPLETE;
1172 }
1173 else if (query_buf->len > 0)
1174 {
1175 result = PSCAN_EOL;
1177 }
1178 else
1179 {
1180 /* never bother to send an empty buffer */
1181 result = PSCAN_INCOMPLETE;
1183 }
1184 break;
1185 case xb:
1186 result = PSCAN_INCOMPLETE;
1188 break;
1189 case xc:
1190 result = PSCAN_INCOMPLETE;
1192 break;
1193 case xd:
1194 result = PSCAN_INCOMPLETE;
1196 break;
1197 case xh:
1198 result = PSCAN_INCOMPLETE;
1200 break;
1201 case xe:
1202 result = PSCAN_INCOMPLETE;
1204 break;
1205 case xq:
1206 result = PSCAN_INCOMPLETE;
1208 break;
1209 case xdolq:
1210 result = PSCAN_INCOMPLETE;
1212 break;
1213 case xui:
1214 result = PSCAN_INCOMPLETE;
1216 break;
1217 case xus:
1218 result = PSCAN_INCOMPLETE;
1220 break;
1221 default:
1222 /* can't get here */
1223 fprintf(stderr, "invalid YY_START\n");
1224 exit(1);
1225 }
1226 break;
1227 case LEXRES_SEMI: /* semicolon */
1228 result = PSCAN_SEMICOLON;
1230 break;
1231 case LEXRES_BACKSLASH: /* backslash */
1232 result = PSCAN_BACKSLASH;
1234 break;
1235 default:
1236 /* can't get here */
1237 fprintf(stderr, "invalid yylex result\n");
1238 exit(1);
1239 }
1240
1241 return result;
1242}
1243
1244/*
1245 * Clean up after scanning a string. This flushes any unread input and
1246 * releases resources (but not the PsqlScanState itself). Note however
1247 * that this does not reset the lexer scan state; that can be done by
1248 * psql_scan_reset(), which is an orthogonal operation.
1249 *
1250 * It is legal to call this when not scanning anything (makes it easier
1251 * to deal with error recovery).
1252 */
1253void
1255{
1256 /* Drop any incomplete variable expansions. */
1257 while (state->buffer_stack != NULL)
1259
1260 /* Done with the outer scan buffer, too */
1261 if (state->scanbufhandle)
1262 yy_delete_buffer(state->scanbufhandle, state->scanner);
1263 state->scanbufhandle = NULL;
1264 if (state->scanbuf)
1265 free(state->scanbuf);
1266 state->scanbuf = NULL;
1267}
1268
1269/*
1270 * Reset lexer scanning state to start conditions. This is appropriate
1271 * for executing \r psql commands (or any other time that we discard the
1272 * prior contents of query_buf). It is not, however, necessary to do this
1273 * when we execute and clear the buffer after getting a PSCAN_SEMICOLON or
1274 * PSCAN_EOL scan result, because the scan state must be INITIAL when those
1275 * conditions are returned.
1276 *
1277 * Note that this is unrelated to flushing unread input; that task is
1278 * done by psql_scan_finish().
1279 */
1280void
1282{
1283 state->start_state = INITIAL;
1284 state->paren_depth = 0;
1285 state->xcdepth = 0; /* not really necessary */
1286 if (state->dolqstart)
1287 free(state->dolqstart);
1288 state->dolqstart = NULL;
1289 state->identifier_count = 0;
1290 state->begin_depth = 0;
1291}
1292
1293/*
1294 * Reselect this lexer (psqlscan.l) after using another one.
1295 *
1296 * Currently and for foreseeable uses, it's sufficient to reset to INITIAL
1297 * state, because we'd never switch to another lexer in a different state.
1298 * However, we don't want to reset e.g. paren_depth, so this can't be
1299 * the same as psql_scan_reset().
1300 *
1301 * Note: psql setjmp error recovery just calls psql_scan_reset(), so that
1302 * must be a superset of this.
1303 *
1304 * Note: it seems likely that other lexers could just assign INITIAL for
1305 * themselves, since that probably has the value zero in every flex-generated
1306 * lexer. But let's not assume that.
1307 */
1308void
1313
1314/*
1315 * Return true if lexer is currently in an "inside quotes" state.
1316 *
1317 * This is pretty grotty but is needed to preserve the old behavior
1318 * that mainloop.c drops blank lines not inside quotes without even
1319 * echoing them.
1320 */
1321bool
1323{
1324 return state->start_state != INITIAL &&
1325 state->start_state != xqs;
1326}
1327
1328/*
1329 * Return the current scanning location (end+1 of last scanned token),
1330 * as a line number counted from 1 and an offset from string start.
1331 *
1332 * This considers only the outermost input string, and therefore is of
1333 * limited use for programs that use psqlscan_push_new_buffer().
1334 *
1335 * It would be a bit easier probably to use "%option yylineno" to count
1336 * lines, but the flex manual says that has a performance cost, and only
1337 * a minority of programs using psqlscan have need for this functionality.
1338 * So we implement it ourselves without adding overhead to the lexer itself.
1339 */
1340void
1342 int *lineno, int *offset)
1343{
1344 const char *line_end;
1345
1346 /*
1347 * We rely on flex's having stored a NUL after the current token in
1348 * scanbuf. Therefore we must specially handle the state before yylex()
1349 * has been called, when obviously that won't have happened yet.
1350 */
1351 if (state->cur_line_no == 0)
1352 {
1353 *lineno = 1;
1354 *offset = 0;
1355 return;
1356 }
1357
1358 /*
1359 * Advance cur_line_no/cur_line_ptr past whatever has been lexed so far.
1360 * Doing this prevents repeated calls from being O(N^2) for long inputs.
1361 */
1362 while ((line_end = strchr(state->cur_line_ptr, '\n')) != NULL)
1363 {
1364 state->cur_line_no++;
1365 state->cur_line_ptr = line_end + 1;
1366 }
1367 state->cur_line_ptr += strlen(state->cur_line_ptr);
1368
1369 /* Report current location. */
1370 *lineno = state->cur_line_no;
1371 *offset = state->cur_line_ptr - state->scanbuf;
1372}
1373
1374/*
1375 * Push the given string onto the stack of stuff to scan.
1376 *
1377 * NOTE SIDE EFFECT: the new buffer is made the active flex input buffer.
1378 */
1379void
1381 const char *varname)
1382{
1384
1386
1387 /*
1388 * In current usage, the passed varname points at the current flex input
1389 * buffer; we must copy it before calling psqlscan_prepare_buffer()
1390 * because that will change the buffer state.
1391 */
1392 stackelem->varname = varname ? pg_strdup(varname) : NULL;
1393
1395 &stackelem->bufstring);
1396 state->curline = stackelem->bufstring;
1397 if (state->safe_encoding)
1398 {
1399 stackelem->origstring = NULL;
1400 state->refline = stackelem->bufstring;
1401 }
1402 else
1403 {
1404 stackelem->origstring = pg_strdup(newstr);
1405 state->refline = stackelem->origstring;
1406 }
1407 stackelem->next = state->buffer_stack;
1408 state->buffer_stack = stackelem;
1409}
1410
1411/*
1412 * Pop the topmost buffer stack item (there must be one!)
1413 *
1414 * NB: after this, the flex input state is unspecified; caller must
1415 * switch to an appropriate buffer to continue lexing.
1416 * See psqlscan_select_top_buffer().
1417 */
1418void
1420{
1421 StackElem *stackelem = state->buffer_stack;
1422
1423 state->buffer_stack = stackelem->next;
1424 yy_delete_buffer(stackelem->buf, state->scanner);
1425 free(stackelem->bufstring);
1426 if (stackelem->origstring)
1427 free(stackelem->origstring);
1428 if (stackelem->varname)
1429 free(stackelem->varname);
1430 free(stackelem);
1431}
1432
1433/*
1434 * Select the topmost surviving buffer as the active input.
1435 */
1436void
1438{
1439 StackElem *stackelem = state->buffer_stack;
1440
1441 if (stackelem != NULL)
1442 {
1443 yy_switch_to_buffer(stackelem->buf, state->scanner);
1444 state->curline = stackelem->bufstring;
1445 state->refline = stackelem->origstring ? stackelem->origstring : stackelem->bufstring;
1446 }
1447 else
1448 {
1449 yy_switch_to_buffer(state->scanbufhandle, state->scanner);
1450 state->curline = state->scanbuf;
1451 state->refline = state->scanline;
1452 }
1453}
1454
1455/*
1456 * Check if specified variable name is the source for any string
1457 * currently being scanned
1458 */
1459bool
1461{
1463
1464 for (stackelem = state->buffer_stack;
1465 stackelem != NULL;
1466 stackelem = stackelem->next)
1467 {
1468 if (stackelem->varname && strcmp(stackelem->varname, varname) == 0)
1469 return true;
1470 }
1471 return false;
1472}
1473
1474/*
1475 * Set up a flex input buffer to scan the given data. We always make a
1476 * copy of the data. If working in an unsafe encoding, the copy has
1477 * multibyte sequences replaced by FFs to avoid fooling the lexer rules.
1478 *
1479 * NOTE SIDE EFFECT: the new buffer is made the active flex input buffer.
1480 */
1483 char **txtcopy)
1484{
1485 char *newtxt;
1486
1487 /* Flex wants two \0 characters after the actual data */
1488 newtxt = pg_malloc_array(char, (len + 2));
1489 *txtcopy = newtxt;
1491
1492 if (state->safe_encoding)
1493 memcpy(newtxt, txt, len);
1494 else
1495 {
1496 /* Gotta do it the hard way */
1497 int i = 0;
1498
1499 while (i < len)
1500 {
1501 int thislen = PQmblen(txt + i, state->encoding);
1502
1503 /* first byte should always be okay... */
1504 newtxt[i] = txt[i];
1505 i++;
1506 while (--thislen > 0 && i < len)
1507 newtxt[i++] = (char) 0xFF;
1508 }
1509 }
1510
1511 return yy_scan_buffer(newtxt, len + 2, state->scanner);
1512}
1513
1514/*
1515 * psqlscan_emit() --- body for ECHO macro
1516 *
1517 * NB: this must be used for ALL and ONLY the text copied from the flex
1518 * input data. If you pass it something that is not part of the yytext
1519 * string, you are making a mistake. Internally generated text can be
1520 * appended directly to state->output_buf.
1521 */
1522void
1524{
1525 PQExpBuffer output_buf = state->output_buf;
1526
1527 if (state->safe_encoding)
1528 appendBinaryPQExpBuffer(output_buf, txt, len);
1529 else
1530 {
1531 /* Gotta do it the hard way */
1532 const char *reference = state->refline;
1533 int i;
1534
1535 reference += (txt - state->curline);
1536
1537 for (i = 0; i < len; i++)
1538 {
1539 char ch = txt[i];
1540
1541 if (ch == (char) 0xFF)
1542 ch = reference[i];
1543 appendPQExpBufferChar(output_buf, ch);
1544 }
1545 }
1546}
1547
1548/*
1549 * psqlscan_extract_substring --- fetch value of (part of) the current token
1550 *
1551 * This is like psqlscan_emit(), except that the data is returned as a
1552 * malloc'd string rather than being pushed directly to state->output_buf.
1553 */
1554char *
1556{
1557 char *result = pg_malloc_array(char, (len + 1));
1558
1559 if (state->safe_encoding)
1560 memcpy(result, txt, len);
1561 else
1562 {
1563 /* Gotta do it the hard way */
1564 const char *reference = state->refline;
1565 int i;
1566
1567 reference += (txt - state->curline);
1568
1569 for (i = 0; i < len; i++)
1570 {
1571 char ch = txt[i];
1572
1573 if (ch == (char) 0xFF)
1574 ch = reference[i];
1575 result[i] = ch;
1576 }
1577 }
1578 result[len] = '\0';
1579 return result;
1580}
1581
1582/*
1583 * psqlscan_escape_variable --- process :'VARIABLE' or :"VARIABLE"
1584 *
1585 * If the variable name is found, escape its value using the appropriate
1586 * quoting method and emit the value to output_buf. (Since the result is
1587 * surely quoted, there is never any reason to rescan it.) If we don't
1588 * find the variable or escaping fails, emit the token as-is.
1589 */
1590void
1592 PsqlScanQuoteType quote)
1593{
1594 char *varname;
1595 char *value;
1596
1597 /* Variable lookup. */
1598 varname = psqlscan_extract_substring(state, txt + 2, len - 3);
1599 if (state->callbacks->get_variable)
1600 value = state->callbacks->get_variable(varname, quote,
1601 state->cb_passthrough);
1602 else
1603 value = NULL;
1604 free(varname);
1605
1606 if (value)
1607 {
1608 /* Emit the suitably-escaped value */
1609 appendPQExpBufferStr(state->output_buf, value);
1610 free(value);
1611 }
1612 else
1613 {
1614 /* Emit original token as-is */
1616 }
1617}
1618
1619void
1621{
1622 char *varname;
1623 char *value;
1624
1625 varname = psqlscan_extract_substring(state, txt + 3, len - 4);
1626 if (state->callbacks->get_variable)
1627 value = state->callbacks->get_variable(varname, PQUOTE_PLAIN,
1628 state->cb_passthrough);
1629 else
1630 value = NULL;
1631 free(varname);
1632
1633 if (value != NULL)
1634 {
1635 appendPQExpBufferStr(state->output_buf, "TRUE");
1636 free(value);
1637 }
1638 else
1639 {
1640 appendPQExpBufferStr(state->output_buf, "FALSE");
1641 }
1642}
#define Assert(condition)
Definition c.h:945
#define fprintf(file, fmt, msg)
Definition cubescan.l:21
int PQmblen(const char *s, int encoding)
Definition fe-misc.c:1255
#define pg_malloc_array(type, count)
Definition fe_memutils.h:56
#define pg_malloc0_object(type)
Definition fe_memutils.h:51
#define pg_malloc_object(type)
Definition fe_memutils.h:50
static char * encoding
Definition initdb.c:139
int i
Definition isn.c:77
const void size_t len
#define pg_valid_server_encoding_id
Definition pg_wchar.h:632
int yylex(void)
Definition pgc.l:465
void appendBinaryPQExpBuffer(PQExpBuffer str, const char *data, size_t datalen)
void appendPQExpBufferChar(PQExpBuffer str, char ch)
void appendPQExpBufferStr(PQExpBuffer str, const char *data)
PsqlScanResult
Definition psqlscan.h:31
@ PSCAN_BACKSLASH
Definition psqlscan.h:33
@ PSCAN_EOL
Definition psqlscan.h:35
@ PSCAN_INCOMPLETE
Definition psqlscan.h:34
@ PSCAN_SEMICOLON
Definition psqlscan.h:32
enum _promptStatus promptStatus_t
PsqlScanQuoteType
Definition psqlscan.h:53
@ PROMPT_READY
Definition psqlscan.h:41
@ PROMPT_PAREN
Definition psqlscan.h:47
@ PROMPT_COMMENT
Definition psqlscan.h:43
@ PROMPT_CONTINUE
Definition psqlscan.h:42
@ PROMPT_SINGLEQUOTE
Definition psqlscan.h:44
@ PROMPT_DOLLARQUOTE
Definition psqlscan.h:46
@ PROMPT_DOUBLEQUOTE
Definition psqlscan.h:45
YY_BUFFER_STATE psqlscan_prepare_buffer(PsqlScanState state, const char *txt, int len, char **txtcopy)
Definition psqlscan.l:1482
void psql_scan_get_location(PsqlScanState state, int *lineno, int *offset)
Definition psqlscan.l:1341
void psql_scan_reset(PsqlScanState state)
Definition psqlscan.l:1281
void psql_scan_destroy(PsqlScanState state)
Definition psqlscan.l:1028
PsqlScanResult psql_scan(PsqlScanState state, PQExpBuffer query_buf, promptStatus_t *prompt)
Definition psqlscan.l:1127
PsqlScanState psql_scan_create(const PsqlScanCallbacks *callbacks)
Definition psqlscan.l:1007
void psql_scan_set_passthrough(PsqlScanState state, void *passthrough)
Definition psqlscan.l:1047
void psql_scan_setup(PsqlScanState state, const char *line, int line_len, int encoding, bool std_strings)
Definition psqlscan.l:1065
void psql_scan_reselect_sql_lexer(PsqlScanState state)
Definition psqlscan.l:1309
bool psql_scan_in_quote(PsqlScanState state)
Definition psqlscan.l:1322
void psql_scan_finish(PsqlScanState state)
Definition psqlscan.l:1254
struct yy_buffer_state * YY_BUFFER_STATE
struct state * next
Definition regguts.h:332