summaryrefslogtreecommitdiff
path: root/src/backend/parser/scan.l
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser/scan.l')
-rw-r--r--src/backend/parser/scan.l48
1 files changed, 40 insertions, 8 deletions
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index a73934913d..a5ed54792b 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -24,7 +24,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/scan.l,v 1.156 2009/07/13 03:11:12 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/scan.l,v 1.157 2009/07/14 20:24:10 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -304,6 +304,10 @@ identifier {ident_start}{ident_cont}*
typecast "::"
+/* these two token types are used by PL/pgsql, though not in core SQL */
+dot_dot \.\.
+colon_equals ":="
+
/*
* "self" is the set of chars that should be returned as single-character
* tokens. "op_chars" is the set of chars that can make up "Op" tokens,
@@ -450,11 +454,21 @@ other .
SET_YYLLOC();
yyless(1); /* eat only 'n' this time */
- /* nchar had better be a keyword! */
- keyword = ScanKeywordLookup("nchar");
- Assert(keyword != NULL);
- yylval->keyword = keyword->name;
- return keyword->value;
+
+ keyword = ScanKeywordLookup("nchar",
+ yyextra->keywords,
+ yyextra->num_keywords);
+ if (keyword != NULL)
+ {
+ yylval->keyword = keyword->name;
+ return keyword->value;
+ }
+ else
+ {
+ /* If NCHAR isn't a keyword, just return "n" */
+ yylval->str = pstrdup("n");
+ return IDENT;
+ }
}
{xqstart} {
@@ -680,6 +694,16 @@ other .
return TYPECAST;
}
+{dot_dot} {
+ SET_YYLLOC();
+ return DOT_DOT;
+ }
+
+{colon_equals} {
+ SET_YYLLOC();
+ return COLON_EQUALS;
+ }
+
{self} {
SET_YYLLOC();
return yytext[0];
@@ -830,7 +854,9 @@ other .
SET_YYLLOC();
/* Is it a keyword? */
- keyword = ScanKeywordLookup(yytext);
+ keyword = ScanKeywordLookup(yytext,
+ yyextra->keywords,
+ yyextra->num_keywords);
if (keyword != NULL)
{
yylval->keyword = keyword->name;
@@ -939,7 +965,10 @@ scanner_yyerror(const char *message, base_yyscan_t yyscanner)
* Called before any actual parsing is done
*/
base_yyscan_t
-scanner_init(const char *str, base_yy_extra_type *yyext)
+scanner_init(const char *str,
+ base_yy_extra_type *yyext,
+ const ScanKeyword *keywords,
+ int num_keywords)
{
Size slen = strlen(str);
yyscan_t scanner;
@@ -949,6 +978,9 @@ scanner_init(const char *str, base_yy_extra_type *yyext)
base_yyset_extra(yyext, scanner);
+ yyext->keywords = keywords;
+ yyext->num_keywords = num_keywords;
+
/*
* Make a scan buffer with special termination needed by flex.
*/