diff options
-rw-r--r-- | src/backend/nodes/outfuncs.c | 9 | ||||
-rw-r--r-- | src/backend/nodes/read.c | 11 | ||||
-rw-r--r-- | src/test/regress/expected/bit.out | 17 | ||||
-rw-r--r-- | src/test/regress/sql/bit.sql | 5 |
4 files changed, 32 insertions, 10 deletions
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 955286513d2..e56392e6f9d 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -680,8 +680,13 @@ _outString(StringInfo str, const String *node) static void _outBitString(StringInfo str, const BitString *node) { - /* internal representation already has leading 'b' */ - appendStringInfoString(str, node->bsval); + /* + * The lexer will always produce a string starting with 'b' or 'x'. There + * might be characters following that that need escaping, but outToken + * won't escape the 'b' or 'x'. This is relied on by nodeTokenType. + */ + Assert(node->bsval[0] == 'b' || node->bsval[0] == 'x'); + outToken(str, node->bsval); } static void diff --git a/src/backend/nodes/read.c b/src/backend/nodes/read.c index 813eda3e739..5d76f56e4e8 100644 --- a/src/backend/nodes/read.c +++ b/src/backend/nodes/read.c @@ -498,14 +498,9 @@ nodeRead(const char *token, int tok_len) result = (Node *) makeString(debackslash(token + 1, tok_len - 2)); break; case T_BitString: - { - char *val = palloc(tok_len + 1); - - memcpy(val, token, tok_len); - val[tok_len] = '\0'; - result = (Node *) makeBitString(val); - break; - } + /* need to remove backslashes, but there are no quotes */ + result = (Node *) makeBitString(debackslash(token, tok_len)); + break; default: elog(ERROR, "unrecognized node type: %d", (int) type); result = NULL; /* keep compiler happy */ diff --git a/src/test/regress/expected/bit.out b/src/test/regress/expected/bit.out index 98c26550396..e17cbf42ca2 100644 --- a/src/test/regress/expected/bit.out +++ b/src/test/regress/expected/bit.out @@ -40,6 +40,23 @@ SELECT * FROM VARBIT_TABLE; 01010101010 (4 rows) +-- Literals with syntax errors +SELECT b' 0'; +ERROR: " " is not a valid binary digit +LINE 1: SELECT b' 0'; + ^ +SELECT b'0 '; +ERROR: " " is not a valid binary digit +LINE 1: SELECT b'0 '; + ^ +SELECT x' 0'; +ERROR: " " is not a valid hexadecimal digit +LINE 1: SELECT x' 0'; + ^ +SELECT x'0 '; +ERROR: " " is not a valid hexadecimal digit +LINE 1: SELECT x'0 '; + ^ -- Concatenation SELECT v, b, (v || b) AS concat FROM BIT_TABLE, VARBIT_TABLE diff --git a/src/test/regress/sql/bit.sql b/src/test/regress/sql/bit.sql index 2cd550d27eb..34230b99fba 100644 --- a/src/test/regress/sql/bit.sql +++ b/src/test/regress/sql/bit.sql @@ -29,6 +29,11 @@ INSERT INTO VARBIT_TABLE VALUES (B'101011111010'); -- too long --INSERT INTO VARBIT_TABLE VALUES ('X555'); SELECT * FROM VARBIT_TABLE; +-- Literals with syntax errors +SELECT b' 0'; +SELECT b'0 '; +SELECT x' 0'; +SELECT x'0 '; -- Concatenation SELECT v, b, (v || b) AS concat |