diff options
Diffstat (limited to 'src/backend/nodes/read.c')
-rw-r--r-- | src/backend/nodes/read.c | 68 |
1 files changed, 56 insertions, 12 deletions
diff --git a/src/backend/nodes/read.c b/src/backend/nodes/read.c index a775f9120ee..99ed2f248a2 100644 --- a/src/backend/nodes/read.c +++ b/src/backend/nodes/read.c @@ -28,18 +28,30 @@ /* Static state for pg_strtok */ -static char *pg_strtok_ptr = NULL; +static const char *pg_strtok_ptr = NULL; + +/* State flag that determines how readfuncs.c should treat location fields */ +#ifdef WRITE_READ_PARSE_PLAN_TREES +bool restore_location_fields = false; +#endif /* * stringToNode - - * returns a Node with a given legal ASCII representation + * builds a Node tree from its string representation (assumed valid) + * + * restore_loc_fields instructs readfuncs.c whether to restore location + * fields rather than set them to -1. This is currently only supported + * in builds with the WRITE_READ_PARSE_PLAN_TREES debugging flag set. */ -void * -stringToNode(char *str) +static void * +stringToNodeInternal(const char *str, bool restore_loc_fields) { - char *save_strtok; void *retval; + const char *save_strtok; +#ifdef WRITE_READ_PARSE_PLAN_TREES + bool save_restore_location_fields; +#endif /* * We save and restore the pre-existing state of pg_strtok. This makes the @@ -51,13 +63,45 @@ stringToNode(char *str) pg_strtok_ptr = str; /* point pg_strtok at the string to read */ + /* + * If enabled, likewise save/restore the location field handling flag. + */ +#ifdef WRITE_READ_PARSE_PLAN_TREES + save_restore_location_fields = restore_location_fields; + restore_location_fields = restore_loc_fields; +#endif + retval = nodeRead(NULL, 0); /* do the reading */ pg_strtok_ptr = save_strtok; +#ifdef WRITE_READ_PARSE_PLAN_TREES + restore_location_fields = save_restore_location_fields; +#endif + return retval; } +/* + * Externally visible entry points + */ +void * +stringToNode(const char *str) +{ + return stringToNodeInternal(str, false); +} + +#ifdef WRITE_READ_PARSE_PLAN_TREES + +void * +stringToNodeWithLocations(const char *str) +{ + return stringToNodeInternal(str, true); +} + +#endif + + /***************************************************************************** * * the lisp token parser @@ -104,11 +148,11 @@ stringToNode(char *str) * code should add backslashes to a string constant to ensure it is treated * as a single token. */ -char * +const char * pg_strtok(int *length) { - char *local_str; /* working pointer to string */ - char *ret_str; /* start of token to return */ + const char *local_str; /* working pointer to string */ + const char *ret_str; /* start of token to return */ local_str = pg_strtok_ptr; @@ -166,7 +210,7 @@ pg_strtok(int *length) * any protective backslashes in the token are removed. */ char * -debackslash(char *token, int length) +debackslash(const char *token, int length) { char *result = palloc(length + 1); char *ptr = result; @@ -198,10 +242,10 @@ debackslash(char *token, int length) * Assumption: the ascii representation is legal */ static NodeTag -nodeTokenType(char *token, int length) +nodeTokenType(const char *token, int length) { NodeTag retval; - char *numptr; + const char *numptr; int numlen; /* @@ -269,7 +313,7 @@ nodeTokenType(char *token, int length) * this should only be invoked from within a stringToNode operation). */ void * -nodeRead(char *token, int tok_len) +nodeRead(const char *token, int tok_len) { Node *result; NodeTag type; |