Avoid parsing "SELECT (" as function call
authorMarko Kreen <markokr@gmail.com>
Mon, 29 Jun 2009 13:32:29 +0000 (13:32 +0000)
committerMarko Kreen <markokr@gmail.com>
Mon, 29 Jun 2009 13:32:29 +0000 (13:32 +0000)
Currently PL/Proxy fails to parse following statement:

  select (0*0);

As only SELECT statement is affected, fix it by explicitly checking
for that case.

In long-term, the function-call detection should be moved to parser,
thus getting rid of the hack.

Patch by Peter Eisentraut

expected/plproxy_select.out
sql/plproxy_select.sql
src/scanner.l

index 8b4c34625174d44e5e8ac3c6109e5c056c787d78..f8317a2881ff827e866defdcd1207c655767f86e 100644 (file)
@@ -35,3 +35,15 @@ returns integer as $$
 $$ language plproxy;
 select * from test_select_err('user', true);
 ERROR:  PL/Proxy function public.test_select_err(2): Compile error at line 5: Only one SELECT statement allowed
+create function get_zero()
+returns setof integer as $x$
+    cluster 'testcluster';
+    run on all;
+    select (0*0);
+$x$ language plproxy;
+select * from get_zero();
+ get_zero 
+----------
+        0
+(1 row)
+
index 567699728745a21fe36294f87c6f6f418738af86..529ccc2ab8dd755a44ca5fc2c085d0c22a9d6455 100644 (file)
@@ -35,3 +35,12 @@ $$ language plproxy;
 
 select * from test_select_err('user', true);
 
+
+create function get_zero()
+returns setof integer as $x$
+    cluster 'testcluster';
+    run on all;
+    select (0*0);
+$x$ language plproxy;
+
+select * from get_zero();
index 54ebe3705d673dd7a9410f07e21474dbc731bc01..8f54b7f01cbb34e380cabb6e960b01b6fe21f9a4 100644 (file)
@@ -183,6 +183,8 @@ select                      { BEGIN(sql); yylval.str = yytext; return SELECT; }
 
        /* function call */
 
+       /* hack to avoid parsing "SELECT (" as function call */
+select{SPACE}*[(]      { yyless(6); BEGIN(sql); yylval.str = yytext; return SELECT; }
 {IDENT}{SPACE}*[(]     { BEGIN(sql); yylval.str = yytext; return FNCALL; }
 
        /* PL/Proxy language comments/whitespace */