mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	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.)
This commit is contained in:
		@@ -77,6 +77,16 @@ typedef struct core_yy_extra_type
 | 
			
		||||
	const ScanKeyword *keywords;
 | 
			
		||||
	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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user