summaryrefslogtreecommitdiff
path: root/src/include/parser
diff options
context:
space:
mode:
authorTom Lane2015-01-22 23:10:47 +0000
committerTom Lane2015-01-22 23:11:00 +0000
commiteb213acfe2a51ab3dc6d9bbe02d5d8a903366779 (patch)
tree40de0ad7990d8b1b7fd415f1c31b91ed515bd920 /src/include/parser
parentf5f2c2de163352849879fd40e9793a0195fd6594 (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.h10
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