mirror of
https://github.com/postgres/postgres.git
synced 2026-01-05 23:38:41 +03:00
Clean up parsing of ltree and lquery some more.
Fix lquery parsing to handle repeated flag characters correctly, and to enforce the max label length correctly in some cases where it did not before, and to detect empty labels in some cases where it did not before. In a more cosmetic vein, use a switch rather than if-then chains to handle the different states, and avoid unnecessary checks on charlen when looking for ASCII characters, and factor out multiple copies of the label length checking code. Tom Lane and Dmitry Belyavsky Discussion: https://postgr.es/m/CADqLbzLVkBuPX0812o+z=c3i6honszsZZ6VQOSKR3VPbB56P3w@mail.gmail.com
This commit is contained in:
@@ -31,6 +31,29 @@ SELECT '1.2._3'::ltree;
|
||||
1.2._3
|
||||
(1 row)
|
||||
|
||||
-- empty labels not allowed
|
||||
SELECT '.2.3'::ltree;
|
||||
ERROR: ltree syntax error at character 1
|
||||
LINE 1: SELECT '.2.3'::ltree;
|
||||
^
|
||||
SELECT '1..3'::ltree;
|
||||
ERROR: ltree syntax error at character 3
|
||||
LINE 1: SELECT '1..3'::ltree;
|
||||
^
|
||||
SELECT '1.2.'::ltree;
|
||||
ERROR: ltree syntax error
|
||||
LINE 1: SELECT '1.2.'::ltree;
|
||||
^
|
||||
DETAIL: Unexpected end of input.
|
||||
SELECT repeat('x', 255)::ltree;
|
||||
repeat
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
(1 row)
|
||||
|
||||
SELECT repeat('x', 256)::ltree;
|
||||
ERROR: label string is too long
|
||||
DETAIL: Label length is 256, must be at most 255, at character 257.
|
||||
SELECT ltree2text('1.2.3.34.sdf');
|
||||
ltree2text
|
||||
--------------
|
||||
@@ -451,12 +474,81 @@ SELECT 'foo.bar{,}.!a*|b{1,}.c{,44}.d{3,4}'::lquery;
|
||||
foo.bar{,}.!a*|b{1,}.c{,44}.d{3,4}
|
||||
(1 row)
|
||||
|
||||
SELECT 'foo*@@*'::lquery;
|
||||
lquery
|
||||
--------
|
||||
foo@*
|
||||
(1 row)
|
||||
|
||||
SELECT 'qwerty%@*.tu'::lquery;
|
||||
lquery
|
||||
--------------
|
||||
qwerty%@*.tu
|
||||
(1 row)
|
||||
|
||||
-- empty labels not allowed
|
||||
SELECT '.2.3'::lquery;
|
||||
ERROR: lquery syntax error at character 1
|
||||
LINE 1: SELECT '.2.3'::lquery;
|
||||
^
|
||||
SELECT '1..3'::lquery;
|
||||
ERROR: lquery syntax error at character 3
|
||||
LINE 1: SELECT '1..3'::lquery;
|
||||
^
|
||||
SELECT '1.2.'::lquery;
|
||||
ERROR: lquery syntax error
|
||||
LINE 1: SELECT '1.2.'::lquery;
|
||||
^
|
||||
DETAIL: Unexpected end of input.
|
||||
SELECT '@.2.3'::lquery;
|
||||
ERROR: lquery syntax error at character 1
|
||||
LINE 1: SELECT '@.2.3'::lquery;
|
||||
^
|
||||
SELECT '1.@.3'::lquery;
|
||||
ERROR: lquery syntax error at character 3
|
||||
LINE 1: SELECT '1.@.3'::lquery;
|
||||
^
|
||||
SELECT '1.2.@'::lquery;
|
||||
ERROR: lquery syntax error at character 5
|
||||
LINE 1: SELECT '1.2.@'::lquery;
|
||||
^
|
||||
SELECT '!.2.3'::lquery;
|
||||
ERROR: lquery syntax error at character 2
|
||||
LINE 1: SELECT '!.2.3'::lquery;
|
||||
^
|
||||
DETAIL: Empty labels are not allowed.
|
||||
SELECT '1.!.3'::lquery;
|
||||
ERROR: lquery syntax error at character 4
|
||||
LINE 1: SELECT '1.!.3'::lquery;
|
||||
^
|
||||
DETAIL: Empty labels are not allowed.
|
||||
SELECT '1.2.!'::lquery;
|
||||
ERROR: lquery syntax error at character 6
|
||||
LINE 1: SELECT '1.2.!'::lquery;
|
||||
^
|
||||
DETAIL: Empty labels are not allowed.
|
||||
SELECT '1.2.3|@.4'::lquery;
|
||||
ERROR: lquery syntax error at character 7
|
||||
LINE 1: SELECT '1.2.3|@.4'::lquery;
|
||||
^
|
||||
SELECT (repeat('x', 255) || '*@@*')::lquery;
|
||||
lquery
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@*
|
||||
(1 row)
|
||||
|
||||
SELECT (repeat('x', 256) || '*@@*')::lquery;
|
||||
ERROR: label string is too long
|
||||
DETAIL: Label length is 256, must be at most 255, at character 257.
|
||||
SELECT ('!' || repeat('x', 255))::lquery;
|
||||
lquery
|
||||
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
!xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
(1 row)
|
||||
|
||||
SELECT ('!' || repeat('x', 256))::lquery;
|
||||
ERROR: label string is too long
|
||||
DETAIL: Label length is 256, must be at most 255, at character 258.
|
||||
SELECT nlevel('1.2.3.4');
|
||||
nlevel
|
||||
--------
|
||||
@@ -1072,6 +1164,12 @@ SELECT 'QWER_TY'::ltree ~ 'q%@*';
|
||||
t
|
||||
(1 row)
|
||||
|
||||
SELECT 'QWER_TY'::ltree ~ 'q%@*%@*';
|
||||
?column?
|
||||
----------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
SELECT 'QWER_TY'::ltree ~ 'Q_t%@*';
|
||||
?column?
|
||||
----------
|
||||
|
||||
Reference in New Issue
Block a user