diff options
| author | Tom Lane | 2015-01-22 23:10:47 +0000 |
|---|---|---|
| committer | Tom Lane | 2015-01-22 23:11:00 +0000 |
| commit | eb213acfe2a51ab3dc6d9bbe02d5d8a903366779 (patch) | |
| tree | 40de0ad7990d8b1b7fd415f1c31b91ed515bd920 /src/include/parser | |
| parent | f5f2c2de163352849879fd40e9793a0195fd6594 (diff) | |
Prevent duplicate escape-string warnings when using pg_stat_statements.
contrib/pg_stat_statements will sometimes run the core lexer a second time
on submitted statements. Formerly, if you had standard_conforming_strings
turned off, this led to sometimes getting two copies of any warnings
enabled by escape_string_warning. While this is probably no longer a big
deal in the field, it's a pain for regression testing.
To fix, change the lexer so it doesn't consult the escape_string_warning
GUC variable directly, but looks at a copy in the core_yy_extra_type state
struct. Then, pg_stat_statements can change that copy to disable warnings
while it's redoing the lexing.
It seemed like a good idea to make this happen for all three of the GUCs
consulted by the lexer, not just escape_string_warning. There's not an
immediate use-case for callers to adjust the other two AFAIK, but making
it possible is easy enough and seems like good future-proofing.
Arguably this is a bug fix, but there doesn't seem to be enough interest to
justify a back-patch. We'd not be able to back-patch exactly as-is anyway,
for fear of breaking ABI compatibility of the struct. (We could perhaps
back-patch the addition of only escape_string_warning by adding it at the
end of the struct, where there's currently alignment padding space.)
Diffstat (limited to 'src/include/parser')
| -rw-r--r-- | src/include/parser/scanner.h | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/include/parser/scanner.h b/src/include/parser/scanner.h index 02e87642135..e6724bc588e 100644 --- a/src/include/parser/scanner.h +++ b/src/include/parser/scanner.h @@ -78,6 +78,16 @@ typedef struct core_yy_extra_type int num_keywords; /* + * Scanner settings to use. These are initialized from the corresponding + * GUC variables by scanner_init(). Callers can modify them after + * scanner_init() if they don't want the scanner's behavior to follow the + * prevailing GUC settings. + */ + int backslash_quote; + bool escape_string_warning; + bool standard_conforming_strings; + + /* * literalbuf is used to accumulate literal values when multiple rules are * needed to parse a single literal. Call startlit() to reset buffer to * empty, addlit() to add text. NOTE: the string in literalbuf is NOT |
