summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/pg_stat_statements/pg_stat_statements.c3
-rw-r--r--src/backend/parser/scan.l18
-rw-r--r--src/include/parser/scanner.h10
3 files changed, 24 insertions, 7 deletions
diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c
index 2629bfca34f..95616b36914 100644
--- a/contrib/pg_stat_statements/pg_stat_statements.c
+++ b/contrib/pg_stat_statements/pg_stat_statements.c
@@ -2816,6 +2816,9 @@ fill_in_constant_lengths(pgssJumbleState *jstate, const char *query)
ScanKeywords,
NumScanKeywords);
+ /* we don't want to re-emit any escape string warnings */
+ yyextra.escape_string_warning = false;
+
/* Search for each constant, in sequence */
for (i = 0; i < jstate->clocations_count; i++)
{
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index 21a6f30e10c..a78ce03fbd5 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -505,7 +505,7 @@ other .
yyextra->warn_on_first_escape = true;
yyextra->saw_non_ascii = false;
SET_YYLLOC();
- if (standard_conforming_strings)
+ if (yyextra->standard_conforming_strings)
BEGIN(xq);
else
BEGIN(xe);
@@ -520,7 +520,7 @@ other .
}
{xusstart} {
SET_YYLLOC();
- if (!standard_conforming_strings)
+ if (!yyextra->standard_conforming_strings)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("unsafe use of string constant with Unicode escapes"),
@@ -622,8 +622,8 @@ other .
<xe>{xeescape} {
if (yytext[1] == '\'')
{
- if (backslash_quote == BACKSLASH_QUOTE_OFF ||
- (backslash_quote == BACKSLASH_QUOTE_SAFE_ENCODING &&
+ if (yyextra->backslash_quote == BACKSLASH_QUOTE_OFF ||
+ (yyextra->backslash_quote == BACKSLASH_QUOTE_SAFE_ENCODING &&
PG_ENCODING_IS_CLIENT_ONLY(pg_get_client_encoding())))
ereport(ERROR,
(errcode(ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER),
@@ -1074,6 +1074,10 @@ scanner_init(const char *str,
yyext->keywords = keywords;
yyext->num_keywords = num_keywords;
+ yyext->backslash_quote = backslash_quote;
+ yyext->escape_string_warning = escape_string_warning;
+ yyext->standard_conforming_strings = standard_conforming_strings;
+
/*
* Make a scan buffer with special termination needed by flex.
*/
@@ -1433,7 +1437,7 @@ check_string_escape_warning(unsigned char ychar, core_yyscan_t yyscanner)
{
if (ychar == '\'')
{
- if (yyextra->warn_on_first_escape && escape_string_warning)
+ if (yyextra->warn_on_first_escape && yyextra->escape_string_warning)
ereport(WARNING,
(errcode(ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER),
errmsg("nonstandard use of \\' in a string literal"),
@@ -1443,7 +1447,7 @@ check_string_escape_warning(unsigned char ychar, core_yyscan_t yyscanner)
}
else if (ychar == '\\')
{
- if (yyextra->warn_on_first_escape && escape_string_warning)
+ if (yyextra->warn_on_first_escape && yyextra->escape_string_warning)
ereport(WARNING,
(errcode(ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER),
errmsg("nonstandard use of \\\\ in a string literal"),
@@ -1458,7 +1462,7 @@ check_string_escape_warning(unsigned char ychar, core_yyscan_t yyscanner)
static void
check_escape_warning(core_yyscan_t yyscanner)
{
- if (yyextra->warn_on_first_escape && escape_string_warning)
+ if (yyextra->warn_on_first_escape && yyextra->escape_string_warning)
ereport(WARNING,
(errcode(ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER),
errmsg("nonstandard use of escape in a string literal"),
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