summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut2022-09-24 22:10:11 +0000
committerPeter Eisentraut2022-09-24 22:10:11 +0000
commit43f4b349152d972c711592b8e8a4645aea9625f4 (patch)
treef9a27d5f30265e754be0d8bb142a421a2f8c14b3
parent03bf971d2dc701d473705fd00891028d140dd5ae (diff)
Fix reading of most-negative integer value nodes
The main parser checks whether a literal fits into an int when deciding whether it should be put into an Integer or Float node. The parser processes integer literals without signs. So a most-negative integer literal will not fit into Integer and will end up as a Float node. The node tokenizer did this differently. It included the sign when checking whether the literal fit into int. So a most-negative integer would indeed fit that way and end up as an Integer node. In order to preserve the node structure correctly, we need the node tokenizer to also analyze integer literals without sign. There are a number of test cases in the regression tests that have a most-negative integer argument of some utility statement, so this issue is easily reproduced under WRITE_READ_PARSE_PLAN_TREES. Reviewed-by: Tom Lane <[email protected]> Discussion: https://www.postgresql.org/message-id/flat/[email protected]
-rw-r--r--src/backend/nodes/read.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/backend/nodes/read.c b/src/backend/nodes/read.c
index 4a54996b63..a9cb81b129 100644
--- a/src/backend/nodes/read.c
+++ b/src/backend/nodes/read.c
@@ -267,7 +267,7 @@ nodeTokenType(const char *token, int length)
char *endptr;
errno = 0;
- (void) strtoint(token, &endptr, 10);
+ (void) strtoint(numptr, &endptr, 10);
if (endptr != token + length || errno == ERANGE)
return T_Float;
return T_Integer;