![]() | |
![]() |
| | Thread Tools | Display Modes |
#1
| |||
| |||
|
|
CREATE OR REPLACE FUNCTION zzz_test () RETURNS text AS ' SELECT ''hello world'' -- SELECT ''goodbye world'' ::text; ' LANGUAGE 'SQL'; ERROR: parser: unterminated quoted string at or near "'hello world' -- SELECT 'goodbye world' ::text; |
#2
| |||||
| |||||
|
|
Richard Huxton writes: CREATE OR REPLACE FUNCTION zzz_test () RETURNS text AS ' SELECT ''hello world'' -- SELECT ''goodbye world'' ::text; ' LANGUAGE 'SQL'; ERROR: parser: unterminated quoted string at or near "'hello world' -- SELECT 'goodbye world' ::text; That's a good one. |
|
The bug is actually independent of the function definition, but you cannot easily reproduce it in psql, because psql cuts out -- comment before sending the command to the server. Here's how one could do it: |
|
cmd=$(echo -e "SELECT 'hello world'\n-- SELECT 'goodbye world'\n::text;") psql -c "$cmd" The problem is strings of this form: 'foo' 'bar' This is equivalent to 'foobar'. |
|
In your case it's scanning the string similar to 'hello world' -- SELECT 'goodbye world '\n::text; Hence the complain the the string is not terminated. |
|
The bug here is that the scanner doesn't know that a newline (or end of input) is a required as part of a -- comment. If I change the rule comment ("--"{non_newline}*) in scan.l to comment ("--"{non_newline}*){newline} then the example works. This does not cover the case of a comment at the end of the input, but a solution shall be forthcoming. |
#3
| |||
| |||
|
|
The bug here is that the scanner doesn't know that a newline (or end of input) is a required as part of a -- comment. |
#4
| |||
| |||
|
|
I think the minimum-damage place to fix this is by requiring \n after {comment} in the horiz_whitespace rule. As is, it's possible for xqcat to match to a second quote that is in the body of a -- comment. |
![]() |
| Thread Tools | |
| Display Modes | |
| |