mirror of
https://github.com/postgres/postgres.git
synced 2025-10-25 13:17:41 +03:00
Revise plpgsql's scanner to process comments and string literals in a way
more nearly matching the core SQL scanner. The user-visible effects are: * Block comments (slash-star comments) now nest, as per SQL spec. * In standard_conforming_strings mode, backslash as the last character of a non-E string literal is now correctly taken as an ordinary character; formerly it was misinterpreted as escaping the ending quote. (Since the string also had to pass through the core scanner, this invariably led to syntax errors.) * Formerly, backslashes in the format string of RAISE were always treated as quoting the next character, regardless of mode. Now, they are ordinary characters with standard_conforming_strings on, while with it off, they introduce the same set of escapes as in the core SQL scanner. Also, escape_string_warning is now effective for RAISE format strings. These changes make RAISE format strings work just like any other string literal. This is implemented by copying and pasting a lot of logic from the core scanner. It would be a good idea to look into getting rid of plpgsql's scanner entirely in favor of using the core scanner. However, that involves more change than I can justify making during beta --- in particular, the core scanner would have to become re-entrant. In passing, remove the kluge that made the plpgsql scanner emit T_FUNCTION or T_TRIGGER as a made-up first token. That presumably had some value once upon a time, but now it's just useless complication for both the scanner and the grammar.
This commit is contained in:
@@ -3005,3 +3005,47 @@ SELECT * FROM leaker_1(true);
|
||||
|
||||
DROP FUNCTION leaker_1(bool);
|
||||
DROP FUNCTION leaker_2(bool);
|
||||
|
||||
-- Test handling of string literals.
|
||||
|
||||
set standard_conforming_strings = off;
|
||||
|
||||
create or replace function strtest() returns text as $$
|
||||
begin
|
||||
raise notice 'foo\\bar\041baz';
|
||||
return 'foo\\bar\041baz';
|
||||
end
|
||||
$$ language plpgsql;
|
||||
|
||||
select strtest();
|
||||
|
||||
create or replace function strtest() returns text as $$
|
||||
begin
|
||||
raise notice E'foo\\bar\041baz';
|
||||
return E'foo\\bar\041baz';
|
||||
end
|
||||
$$ language plpgsql;
|
||||
|
||||
select strtest();
|
||||
|
||||
set standard_conforming_strings = on;
|
||||
|
||||
create or replace function strtest() returns text as $$
|
||||
begin
|
||||
raise notice 'foo\\bar\041baz\';
|
||||
return 'foo\\bar\041baz\';
|
||||
end
|
||||
$$ language plpgsql;
|
||||
|
||||
select strtest();
|
||||
|
||||
create or replace function strtest() returns text as $$
|
||||
begin
|
||||
raise notice E'foo\\bar\041baz';
|
||||
return E'foo\\bar\041baz';
|
||||
end
|
||||
$$ language plpgsql;
|
||||
|
||||
select strtest();
|
||||
|
||||
drop function strtest();
|
||||
|
||||
Reference in New Issue
Block a user