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.
This commit is contained in:
parent
45436a403f
commit
e91600d1c2
|
@ -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 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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[] = {
|
||||||
{"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 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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
|
||||||
|
|
||||||
%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
|
||||||
%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}
|
||||||
|
|
||||||
<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}
|
||||||
* 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}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
<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}
|
||||||
|
|
||||||
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}
|
||||||
}
|
}
|
||||||
|
|
||||||
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}
|
||||||
<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}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
<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)
|
||||||
}
|
}
|
||||||
startlit();
|
startlit();
|
||||||
|
|
||||||
BEGIN C;
|
BEGIN(C);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static 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
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $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)
|
||||||
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)
|
||||||
%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); }
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
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
|
||||||
{ $$ = 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
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
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
|
||||||
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
|
||||||
/* 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
|
||||||
|
|
||||||
$$ = 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:
|
||||||
| 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
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
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;
|
||||||
/* 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)
|
||||||
#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");}
|
||||||
|
|
Loading…
Reference in New Issue