mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Add a debugging option to stress-test outfuncs.c and readfuncs.c.
In the normal course of operation, query trees will be serialized only if they are stored as views or rules; and plan trees will be serialized only if they get passed to parallel-query workers. This leaves an awful lot of opportunity for bugs/oversights to not get detected, as indeed we've just been reminded of the hard way. To improve matters, this patch adds a new compile option WRITE_READ_PARSE_PLAN_TREES, which is modeled on the longstanding option COPY_PARSE_PLAN_TREES; but instead of passing all parse and plan trees through copyObject, it passes them through nodeToString + stringToNode. Enabling this option in a buildfarm animal or two will catch problems at least for cases that are exercised by the regression tests. A small problem with this idea is that readfuncs.c historically has discarded location fields, on the reasonable grounds that parse locations in a retrieved view are not relevant to the current query. But doing that in WRITE_READ_PARSE_PLAN_TREES breaks pg_stat_statements, and it could cause problems for future improvements that might try to report error locations at runtime. To fix that, provide a variant behavior in readfuncs.c that makes it restore location fields when told to. In passing, const-ify the string arguments of stringToNode and its subsidiary functions, just because it annoyed me that they weren't const already. Discussion: https://postgr.es/m/17114.1537138992@sss.pgh.pa.us
This commit is contained in:
		@@ -610,7 +610,10 @@ extern char *bmsToString(const struct Bitmapset *bms);
 | 
			
		||||
/*
 | 
			
		||||
 * nodes/{readfuncs.c,read.c}
 | 
			
		||||
 */
 | 
			
		||||
extern void *stringToNode(char *str);
 | 
			
		||||
extern void *stringToNode(const char *str);
 | 
			
		||||
#ifdef WRITE_READ_PARSE_PLAN_TREES
 | 
			
		||||
extern void *stringToNodeWithLocations(const char *str);
 | 
			
		||||
#endif
 | 
			
		||||
extern struct Bitmapset *readBitmapset(void);
 | 
			
		||||
extern uintptr_t readDatum(bool typbyval);
 | 
			
		||||
extern bool *readBoolCols(int numCols);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user