aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Meskes <meskes@postgresql.org>2008-01-11 15:19:16 +0000
committerMichael Meskes <meskes@postgresql.org>2008-01-11 15:19:16 +0000
commitda758c266c0c451825b42bb5edbb1514349f16ee (patch)
tree5f4e2126252c2f49da9a9eee348ba289a89d8d3c /src
parent59fc64acee20071dd7386408c2e22a28e8c86541 (diff)
downloadpostgresql-da758c266c0c451825b42bb5edbb1514349f16ee.tar.gz
postgresql-da758c266c0c451825b42bb5edbb1514349f16ee.zip
Fixed lexer to correctly parse C quotes.
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/ecpg/ChangeLog4
-rw-r--r--src/interfaces/ecpg/preproc/pgc.l54
2 files changed, 23 insertions, 35 deletions
diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index 815ba9d2a17..8876c566430 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -2279,6 +2279,10 @@ Fri, 28 Dec 2007 12:15:38 +0100
<itagaki.takahiro@oss.ntt.co.jp> to fix bug in connect statement if
user name is a variable.
- Also fixed test case that didn't detect this.
+
+Fri, 11 Jan 2008 16:16:24 +0100
+
+ - Fixed lexer to correctly parse C quotes.
- Set pgtypes library version to 3.0.
- Set compat library version to 3.0.
- Set ecpg library version to 6.0.
diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l
index 7de33a5fc95..1bdfc7e0fa9 100644
--- a/src/interfaces/ecpg/preproc/pgc.l
+++ b/src/interfaces/ecpg/preproc/pgc.l
@@ -12,7 +12,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.157 2008/01/01 19:45:59 momjian Exp $
+ * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.158 2008/01/11 15:19:16 meskes Exp $
*
*-------------------------------------------------------------------------
*/
@@ -29,7 +29,6 @@ extern YYSTYPE yylval;
static int xcdepth = 0; /* depth of nesting in slash-star comments */
static char *dolqstart; /* current $foo$ quote start string */
static bool escape_string_warning;
-static bool warn_on_first_escape;
static YY_BUFFER_STATE scanbufhandle;
static char *scanbuf;
@@ -47,7 +46,6 @@ static int literalalloc; /* current allocated buffer size */
static void addlit(char *ytext, int yleng);
static void addlitchar (unsigned char);
static void parse_include (void);
-static void check_escape_warning(void);
static bool ecpg_isspace(char ch);
static bool isdefine(void);
static bool isinformixdefine(void);
@@ -101,6 +99,7 @@ static struct _if_value
* <xd> delimited identifiers (double-quoted identifiers) - thomas 1997-10-27
* <xh> hexadecimal numeric string - thomas 1997-11-16
* <xq> standard quoted strings - thomas 1997-07-30
+ * <xqc> standard quoted strings in C - michael
* <xe> extended quoted strings (support backslash escape sequences)
* <xn> national character quoted strings
* <xdolq> $foo$ quoted strings
@@ -114,6 +113,7 @@ static struct _if_value
%x xe
%x xn
%x xq
+%x xqc
%x xdolq
%x xcond
%x xskip
@@ -145,6 +145,7 @@ xch 0[xX][0-9A-Fa-f]*
*/
xqstart {quote}
xqdouble {quote}{quote}
+xqcquote [\\]{quote}
xqinside [^']+
/* $foo$ style quotes ("dollar quoting")
@@ -409,35 +410,31 @@ cppline {space}*#(.*\\{space})*.*{newline}
/* National character.
* Transfer it as-is to the backend.
*/
- warn_on_first_escape = true;
- token_start = yytext;
+ token_start = yytext;
state_before = YYSTATE;
BEGIN(xn);
startlit();
}
<C>{xqstart} {
- warn_on_first_escape = false;
token_start = yytext;
state_before = YYSTATE;
- BEGIN(xq);
+ BEGIN(xqc);
startlit();
}
<SQL>{xqstart} {
- warn_on_first_escape = true;
token_start = yytext;
state_before = YYSTATE;
BEGIN(xq);
startlit();
}
<SQL>{xestart} {
- warn_on_first_escape = false;
token_start = yytext;
state_before = YYSTATE;
BEGIN(xe);
startlit();
}
-<xq>{quotestop} |
-<xq>{quotefail} {
+<xq,xqc>{quotestop} |
+<xq,xqc>{quotefail} {
yyless(1);
BEGIN(state_before);
yylval.str = mm_strdup(literalbuf);
@@ -457,27 +454,22 @@ cppline {space}*#(.*\\{space})*.*{newline}
yylval.str = mm_strdup(literalbuf);
return NCONST;
}
-<xq,xe,xn>{xqdouble} { addlitchar('\''); }
-<xq,xn>{xqinside} { addlit(yytext, yyleng); }
-<xe>{xeinside} { addlit(yytext, yyleng); }
-<xe>{xeescape} {
- check_escape_warning();
- addlit(yytext, yyleng);
+<xq,xe,xn>{xqdouble} { addlitchar('\''); }
+<xqc>{xqcquote} {
+ addlitchar('\\');
+ addlitchar('\'');
}
-<xe>{xeoctesc} {
- check_escape_warning();
- addlit(yytext, yyleng);
- }
-<xe>{xehexesc} {
- check_escape_warning();
- addlit(yytext, yyleng);
- }
-<xq,xe,xn>{quotecontinue} { /* ignore */ }
+<xq,xqc,xn>{xqinside} { addlit(yytext, yyleng); }
+<xe>{xeinside} { addlit(yytext, yyleng); }
+<xe>{xeescape} { addlit(yytext, yyleng); }
+<xe>{xeoctesc} { addlit(yytext, yyleng); }
+<xe>{xehexesc} { addlit(yytext, yyleng); }
+<xq,xqc,xe,xn>{quotecontinue} { /* ignore */ }
<xe>. {
/* This is only needed for \ just before EOF */
addlitchar(yytext[0]);
}
-<xq,xe,xn><<EOF>> { mmerror(PARSE_ERROR, ET_FATAL, "Unterminated quoted string"); }
+<xq,xqc,xe,xn><<EOF>> { mmerror(PARSE_ERROR, ET_FATAL, "Unterminated quoted string"); }
<SQL>{dolqfailed} {
/* throw back all but the initial "$" */
yyless(1);
@@ -1284,14 +1276,6 @@ parse_include(void)
BEGIN(C);
}
-static void
-check_escape_warning(void)
-{
- if (warn_on_first_escape && escape_string_warning)
- mmerror (PARSE_ERROR, ET_WARNING, "nonstandard use of escape in a string literal");
- warn_on_first_escape = false; /* warn only once per string */
-}
-
/*
* ecpg_isspace() --- return TRUE if flex scanner considers char whitespace
*/