Commit e91600d1 authored by Michael Meskes's avatar Michael Meskes

Changed lexer to no longer use the default rule.

Synced parser and keyword list.
Fixed parsing of CONNECT statement so it accepts a C string again.
parent 45436a40
...@@ -2095,5 +2095,11 @@ Mo Aug 14 10:39:59 CEST 2006 ...@@ -2095,5 +2095,11 @@ Mo Aug 14 10:39:59 CEST 2006
- Fixed broken newline on Windows. - Fixed broken newline on Windows.
- Fixed a nasty buffer underrun that only occured when using Informix - Fixed a nasty buffer underrun that only occured when using Informix
no_indicator NULL setting on timestamps and intervals. no_indicator NULL setting on timestamps and intervals.
Fr 18. Aug 17:32:54 CEST 2006
- Changed lexer to no longer use the default rule.
- Synced parser and keyword list.
- Fixed parsing of CONNECT statement so it accepts a C string again.
- Set ecpg library version to 5.2. - Set ecpg library version to 5.2.
- Set ecpg version to 4.2.1. - Set ecpg version to 4.2.1.
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.74 2006/08/02 13:43:23 meskes Exp $ * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.75 2006/08/18 15:59:35 meskes Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -277,6 +277,7 @@ static ScanKeyword ScanKeywords[] = { ...@@ -277,6 +277,7 @@ static ScanKeyword ScanKeywords[] = {
{"reset", RESET}, {"reset", RESET},
{"restart", RESTART}, {"restart", RESTART},
{"restrict", RESTRICT}, {"restrict", RESTRICT},
{"returning", RETURNING},
{"returns", RETURNS}, {"returns", RETURNS},
{"revoke", REVOKE}, {"revoke", REVOKE},
{"right", RIGHT}, {"right", RIGHT},
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.148 2006/08/02 13:43:23 meskes Exp $ * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.149 2006/08/18 15:59:35 meskes Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -79,7 +79,7 @@ static struct _if_value ...@@ -79,7 +79,7 @@ static struct _if_value
%option yylineno %option yylineno
%s C SQL incl def def_ident undef %x C SQL incl def def_ident undef
/* /*
* OK, here is a short description of lex/flex rules behavior. * OK, here is a short description of lex/flex rules behavior.
...@@ -109,7 +109,6 @@ static struct _if_value ...@@ -109,7 +109,6 @@ static struct _if_value
%x xe %x xe
%x xq %x xq
%x xdolq %x xdolq
%x xpre
%x xcond %x xcond
%x xskip %x xskip
...@@ -327,7 +326,7 @@ cppline {space}*#(.*\\{space})*.*{newline} ...@@ -327,7 +326,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
<SQL>{whitespace} { /* ignore */ } <SQL>{whitespace} { /* ignore */ }
{xcstart} { <C,SQL>{xcstart} {
token_start = yytext; token_start = yytext;
state_before = YYSTATE; state_before = YYSTATE;
xcdepth = 0; xcdepth = 0;
...@@ -545,7 +544,7 @@ cppline {space}*#(.*\\{space})*.*{newline} ...@@ -545,7 +544,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
* This is not an EOL marker. * This is not an EOL marker.
*/ */
if (yytext[0] == ';' && struct_level == 0) if (yytext[0] == ';' && struct_level == 0)
BEGIN C; BEGIN(C);
return yytext[0]; return yytext[0];
} }
<SQL>{operator} { <SQL>{operator} {
...@@ -720,12 +719,12 @@ cppline {space}*#(.*\\{space})*.*{newline} ...@@ -720,12 +719,12 @@ cppline {space}*#(.*\\{space})*.*{newline}
} }
} }
<SQL>{other} { return yytext[0]; } <SQL>{other} { return yytext[0]; }
<C>{exec_sql} { BEGIN SQL; return SQL_START; } <C>{exec_sql} { BEGIN(SQL); return SQL_START; }
<C>{informix_special} { <C>{informix_special} {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (INFORMIX_MODE) if (INFORMIX_MODE)
{ {
BEGIN SQL; BEGIN(SQL);
return SQL_START; return SQL_START;
} }
else else
...@@ -896,7 +895,7 @@ cppline {space}*#(.*\\{space})*.*{newline} ...@@ -896,7 +895,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
BEGIN(C); BEGIN(C);
} }
<undef>{other} { <undef>{other}|\n {
mmerror(PARSE_ERROR, ET_FATAL, "Missing identifier in 'EXEC SQL UNDEF' command"); mmerror(PARSE_ERROR, ET_FATAL, "Missing identifier in 'EXEC SQL UNDEF' command");
yyterminate(); yyterminate();
} }
...@@ -1077,24 +1076,24 @@ cppline {space}*#(.*\\{space})*.*{newline} ...@@ -1077,24 +1076,24 @@ cppline {space}*#(.*\\{space})*.*{newline}
} }
if (stacked_if_value[preproc_tos].condition) if (stacked_if_value[preproc_tos].condition)
BEGIN C; BEGIN(C);
else else
BEGIN(xskip); BEGIN(xskip);
} }
<xcond>{other} { <xcond>{other}|\n {
mmerror(PARSE_ERROR, ET_FATAL, "Missing identifier in 'EXEC SQL IFDEF' command"); mmerror(PARSE_ERROR, ET_FATAL, "Missing identifier in 'EXEC SQL IFDEF' command");
yyterminate(); yyterminate();
} }
<def_ident>{identifier} { <def_ident>{identifier} {
old = mm_strdup(yytext); old = mm_strdup(yytext);
BEGIN(def); BEGIN(def);
startlit(); startlit();
} }
<def_ident>{other} { <def_ident>{other}|\n {
mmerror(PARSE_ERROR, ET_FATAL, "Missing identifier in 'EXEC SQL DEFINE' command"); mmerror(PARSE_ERROR, ET_FATAL, "Missing identifier in 'EXEC SQL DEFINE' command");
yyterminate(); yyterminate();
} }
<def>{space}*";" { <def>{space}*";" {
struct _defines *ptr, *this; struct _defines *ptr, *this;
...@@ -1124,10 +1123,10 @@ cppline {space}*#(.*\\{space})*.*{newline} ...@@ -1124,10 +1123,10 @@ cppline {space}*#(.*\\{space})*.*{newline}
<incl>\<[^\>]+\>{space}*";"? { parse_include(); } <incl>\<[^\>]+\>{space}*";"? { parse_include(); }
<incl>{dquote}{xdinside}{dquote}{space}*";"? { parse_include(); } <incl>{dquote}{xdinside}{dquote}{space}*";"? { parse_include(); }
<incl>[^;\<\>\"]+";" { parse_include(); } <incl>[^;\<\>\"]+";" { parse_include(); }
<incl>{other} { <incl>{other}|\n {
mmerror(PARSE_ERROR, ET_FATAL, "Incorrect 'EXEC SQL INCLUDE' command"); mmerror(PARSE_ERROR, ET_FATAL, "Incorrect 'EXEC SQL INCLUDE' command");
yyterminate(); yyterminate();
} }
<<EOF>> { <<EOF>> {
if (yy_buffer == NULL) if (yy_buffer == NULL)
...@@ -1174,6 +1173,7 @@ cppline {space}*#(.*\\{space})*.*{newline} ...@@ -1174,6 +1173,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
} }
} }
<INITIAL>{other}|\n { mmerror(PARSE_ERROR, ET_FATAL, "Internal error: unreachable state, please inform pgsql-bugs@postgresql.org"); }
%% %%
void void
lex_init(void) lex_init(void)
...@@ -1194,7 +1194,7 @@ lex_init(void) ...@@ -1194,7 +1194,7 @@ lex_init(void)
} }
startlit(); startlit();
BEGIN C; BEGIN(C);
} }
static void static void
...@@ -1318,7 +1318,7 @@ parse_include(void) ...@@ -1318,7 +1318,7 @@ parse_include(void)
yylineno = 1; yylineno = 1;
output_line_number(); output_line_number();
BEGIN C; BEGIN(C);
} }
static void static void
......
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.328 2006/08/08 11:51:24 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.329 2006/08/18 15:59:35 meskes Exp $ */
/* Copyright comment */ /* Copyright comment */
%{ %{
...@@ -407,7 +407,7 @@ add_additional_variables(char *name, bool insert) ...@@ -407,7 +407,7 @@ add_additional_variables(char *name, bool insert)
QUOTE QUOTE
READ REAL REASSIGN RECHECK REFERENCES REINDEX RELATIVE_P RELEASE RENAME READ REAL REASSIGN RECHECK REFERENCES REINDEX RELATIVE_P RELEASE RENAME
REPEATABLE REPLACE RESET RESTART RESTRICT RETURNS REVOKE RIGHT REPEATABLE REPLACE RESET RESTART RESTRICT RETURNING RETURNS REVOKE RIGHT
ROLE ROLLBACK ROW ROWS RULE ROLE ROLLBACK ROW ROWS RULE
SAVEPOINT SCHEMA SCROLL SECOND_P SECURITY SELECT SEQUENCE SAVEPOINT SCHEMA SCROLL SECOND_P SECURITY SELECT SEQUENCE
...@@ -497,7 +497,7 @@ add_additional_variables(char *name, bool insert) ...@@ -497,7 +497,7 @@ add_additional_variables(char *name, bool insert)
%type <str> columnList DeleteStmt UpdateStmt DeclareCursorStmt %type <str> columnList DeleteStmt UpdateStmt DeclareCursorStmt
%type <str> NotifyStmt columnElem UnlistenStmt TableElement %type <str> NotifyStmt columnElem UnlistenStmt TableElement
%type <str> copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary %type <str> copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary
%type <str> FetchStmt from_in CreateOpClassStmt %type <str> FetchStmt from_in CreateOpClassStmt returning_clause
%type <str> ClosePortalStmt DropStmt VacuumStmt AnalyzeStmt opt_verbose %type <str> ClosePortalStmt DropStmt VacuumStmt AnalyzeStmt opt_verbose
%type <str> opt_full func_arg OptWith opt_freeze alter_table_cmd %type <str> opt_full func_arg OptWith opt_freeze alter_table_cmd
%type <str> analyze_keyword opt_name_list ExplainStmt index_params %type <str> analyze_keyword opt_name_list ExplainStmt index_params
...@@ -3090,8 +3090,8 @@ DeallocateStmt: DEALLOCATE name { $$ = cat2_str(make_str("deallocate"), $2); } ...@@ -3090,8 +3090,8 @@ DeallocateStmt: DEALLOCATE name { $$ = cat2_str(make_str("deallocate"), $2); }
* *
*****************************************************************************/ *****************************************************************************/
InsertStmt: INSERT INTO qualified_name insert_rest InsertStmt: INSERT INTO qualified_name insert_rest returning_clause
{ $$ = cat_str(3, make_str("insert into"), $3, $4); } { $$ = cat_str(4, make_str("insert into"), $3, $4, $5); }
; ;
insert_rest: insert_rest:
...@@ -3113,6 +3113,9 @@ insert_column_item: ColId opt_indirection ...@@ -3113,6 +3113,9 @@ insert_column_item: ColId opt_indirection
{ $$ = cat2_str($1, $2); } { $$ = cat2_str($1, $2); }
; ;
returning_clause: RETURNING target_list { $$ = cat2_str(make_str("returning"), $2); }
| /* EMPTY */ { $$ = EMPTY; }
;
/***************************************************************************** /*****************************************************************************
* *
...@@ -3121,8 +3124,8 @@ insert_column_item: ColId opt_indirection ...@@ -3121,8 +3124,8 @@ insert_column_item: ColId opt_indirection
* *
*****************************************************************************/ *****************************************************************************/
DeleteStmt: DELETE_P FROM relation_expr_opt_alias using_clause where_clause DeleteStmt: DELETE_P FROM relation_expr_opt_alias using_clause where_clause returning_clause
{ $$ = cat_str(4, make_str("delete from"), $3, $4, $5); } { $$ = cat_str(5, make_str("delete from"), $3, $4, $5, $6); }
; ;
using_clause: USING from_list { cat2_str(make_str("using"), $2); } using_clause: USING from_list { cat2_str(make_str("using"), $2); }
...@@ -3164,7 +3167,8 @@ UpdateStmt: UPDATE relation_expr_opt_alias ...@@ -3164,7 +3167,8 @@ UpdateStmt: UPDATE relation_expr_opt_alias
SET update_target_list SET update_target_list
from_clause from_clause
where_clause where_clause
{$$ = cat_str(6, make_str("update"), $2, make_str("set"), $4, $5, $6); } returning_clause
{$$ = cat_str(7, make_str("update"), $2, make_str("set"), $4, $5, $6, $7); }
; ;
...@@ -4615,8 +4619,12 @@ connection_target: database_name opt_server opt_port ...@@ -4615,8 +4619,12 @@ connection_target: database_name opt_server opt_port
/* old style: dbname[@server][:port] */ /* old style: dbname[@server][:port] */
if (strlen($2) > 0 && *($2) != '@') if (strlen($2) > 0 && *($2) != '@')
mmerror(PARSE_ERROR, ET_ERROR, "Expected '@', found '%s'", $2); mmerror(PARSE_ERROR, ET_ERROR, "Expected '@', found '%s'", $2);
$$ = make3_str(make_str("\""), make3_str($1, $2, $3), make_str("\"")); /* C strings need to be handled differently */
if ($1[0] == '\"')
$$ = $1;
else
$$ = make3_str(make_str("\""), make3_str($1, $2, $3), make_str("\""));
} }
| db_prefix ':' server opt_port '/' database_name opt_options | db_prefix ':' server opt_port '/' database_name opt_options
{ {
...@@ -4634,13 +4642,6 @@ connection_target: database_name opt_server opt_port ...@@ -4634,13 +4642,6 @@ connection_target: database_name opt_server opt_port
$$ = make3_str(make3_str(make_str("\""), $1, make_str(":")), $3, make3_str(make3_str($4, make_str("/"), $6), $7, make_str("\""))); $$ = make3_str(make3_str(make_str("\""), $1, make_str(":")), $3, make3_str(make3_str($4, make_str("/"), $6), $7, make_str("\"")));
} }
| Sconst
{
if ($1[0] == '\"')
$$ = $1;
else
$$ = make3_str(make_str("\""), $1, make_str("\""));
}
| char_variable | char_variable
{ {
$$ = $1; $$ = $1;
...@@ -6509,9 +6510,10 @@ reserved_keyword: ...@@ -6509,9 +6510,10 @@ reserved_keyword:
| OR { $$ = make_str("or"); } | OR { $$ = make_str("or"); }
| ORDER { $$ = make_str("order"); } | ORDER { $$ = make_str("order"); }
| PRIMARY { $$ = make_str("primary"); } | PRIMARY { $$ = make_str("primary"); }
| REFERENCES { $$ = make_str("references"); } | REFERENCES { $$ = make_str("references"); }
| RETURNING { $$ = make_str("returning"); }
| SELECT { $$ = make_str("select"); } | SELECT { $$ = make_str("select"); }
| SESSION_USER { $$ = make_str("session_user"); } | SESSION_USER { $$ = make_str("session_user"); }
| SOME { $$ = make_str("some"); } | SOME { $$ = make_str("some"); }
| SYMMETRIC { $$ = make_str("symmetric"); } | SYMMETRIC { $$ = make_str("symmetric"); }
| TABLE { $$ = make_str("table"); } | TABLE { $$ = make_str("table"); }
...@@ -6604,7 +6606,7 @@ cvariable: CVARIABLE ...@@ -6604,7 +6606,7 @@ cvariable: CVARIABLE
} }
; ;
ident: IDENT { $$ = $1; } ident: IDENT { $$ = $1; }
| CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); } | CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
; ;
quoted_ident_stringvar: name quoted_ident_stringvar: name
......
...@@ -34,7 +34,7 @@ exec sql end declare section; ...@@ -34,7 +34,7 @@ exec sql end declare section;
/* will close "second" */ /* will close "second" */
exec sql disconnect DEFAULT; exec sql disconnect DEFAULT;
exec sql connect to REGRESSDB1 as second; exec sql connect to "connectdb" as second;
exec sql disconnect ALL; exec sql disconnect ALL;
exec sql disconnect CURRENT; exec sql disconnect CURRENT;
......
...@@ -78,7 +78,7 @@ main(void) ...@@ -78,7 +78,7 @@ main(void)
#line 35 "test3.pgc" #line 35 "test3.pgc"
{ ECPGconnect(__LINE__, 0, "regress1" , NULL,NULL , "second", 0); } { ECPGconnect(__LINE__, 0, "connectdb" , NULL,NULL , "second", 0); }
#line 37 "test3.pgc" #line 37 "test3.pgc"
{ ECPGdisconnect(__LINE__, "ALL");} { ECPGdisconnect(__LINE__, "ALL");}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment