From d307616c4a53df5d1b01d284049a7f96fbae6777 Mon Sep 17 00:00:00 2001 From: youdie006 Date: Fri, 2 Oct 2026 19:29:30 +0900 Subject: [PATCH] Fix tokenizing of geometric operators starting with ? The JSON operator group matched a bare ? and ?| before the geometric group, so ?#, ?-, ?-| and ?|| were split into separate tokens. --- lib/pgFormatter/Beautify.pm | 2 +- t/02_regress.t | 2 +- t/pg-test-files/expected/geometry.sql | 22 ++++++++++---------- t/test-files/ex88.sql | 4 ++++ t/test-files/expected/ex88.sql | 29 +++++++++++++++++++++++++++ 5 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 t/test-files/ex88.sql create mode 100644 t/test-files/expected/ex88.sql diff --git a/lib/pgFormatter/Beautify.pm b/lib/pgFormatter/Beautify.pm index 13af56a6..e5c90f22 100755 --- a/lib/pgFormatter/Beautify.pm +++ b/lib/pgFormatter/Beautify.pm @@ -708,7 +708,7 @@ sub tokenize_sql { | (?:<\%|\%>|<<\->|<\->>|<\->) # pg_trgm and some geometry operators | - (?:\->>|\->|<\#>|\#>>|\#>|\?\&|\?\||\?|\@\?) # Vector and Json Operators + (?:\->>|\->|<\#>|\#>>|\#>|\?\&|\@\?) # Vector and Json Operators | (?:\#<=|\#>=|\#<>|\#<|\#=) # compares tinterval and reltime | diff --git a/t/02_regress.t b/t/02_regress.t index 34816404..6564ca1f 100755 --- a/t/02_regress.t +++ b/t/02_regress.t @@ -1,4 +1,4 @@ -use Test::Simple tests => 90; +use Test::Simple tests => 91; use File::Temp qw/ tempfile /; my $pg_format = $ENV{PG_FORMAT} // './pg_format'; # set to the full path to 'pg_format' to test installed binary in /usr/bin diff --git a/t/pg-test-files/expected/geometry.sql b/t/pg-test-files/expected/geometry.sql index 6d3310f0..4cb3ed68 100644 --- a/t/pg-test-files/expected/geometry.sql +++ b/t/pg-test-files/expected/geometry.sql @@ -55,7 +55,7 @@ SELECT FROM POINT_TBL p1 WHERE - p1.f1 ? - point '(0,0)'; + p1.f1 ?- point '(0,0)'; -- "is vertical" function SELECT @@ -276,7 +276,7 @@ SELECT FROM LINE_TBL WHERE - ? - s; + ?- s; -- Same as line SELECT @@ -296,7 +296,7 @@ FROM LINE_TBL l1, LINE_TBL l2 WHERE - l1.s ?| | l2.s; + l1.s ?|| l2.s; -- Perpendicular to line SELECT @@ -306,7 +306,7 @@ FROM LINE_TBL l1, LINE_TBL l2 WHERE - l1.s ? - | l2.s; + l1.s ?-| l2.s; -- Distance to line SELECT @@ -334,7 +334,7 @@ FROM LINE_TBL l1, LINE_TBL l2 WHERE - l1.s ? # l2.s; + l1.s ?# l2.s; -- Intersect with box SELECT @@ -344,7 +344,7 @@ FROM LINE_TBL l, BOX_TBL b WHERE - l.s ? # b.f1; + l.s ?# b.f1; -- Intersection point with line SELECT @@ -407,7 +407,7 @@ SELECT FROM LSEG_TBL WHERE - ? - s; + ?- s; -- Center SELECT @@ -491,7 +491,7 @@ FROM LSEG_TBL l1, LSEG_TBL l2 WHERE - l1.s ?| | l2.s; + l1.s ?|| l2.s; -- Perpendicular with line segment SELECT @@ -501,7 +501,7 @@ FROM LSEG_TBL l1, LSEG_TBL l2 WHERE - l1.s ? - | l2.s; + l1.s ?-| l2.s; -- Distance to line SELECT @@ -538,7 +538,7 @@ FROM LSEG_TBL l, LINE_TBL l1 WHERE - l.s ? # l1.s; + l.s ?# l1.s; -- Intersect with box SELECT @@ -548,7 +548,7 @@ FROM LSEG_TBL l, BOX_TBL b WHERE - l.s ? # b.f1; + l.s ?# b.f1; -- Intersection point with line segment SELECT diff --git a/t/test-files/ex88.sql b/t/test-files/ex88.sql new file mode 100644 index 00000000..2c4e1411 --- /dev/null +++ b/t/test-files/ex88.sql @@ -0,0 +1,4 @@ +-- Geometric operators starting with ? must not be split +SELECT l1.s, l2.s FROM LSEG_TBL l1, LSEG_TBL l2 WHERE l1.s ?# l2.s AND l1.s ?|| l2.s AND l1.s ?-| l2.s; +SELECT s FROM LINE_TBL WHERE ?- s AND ?| s AND p ?- point '(0,0)'; +SELECT j ? 'a', j ?| ARRAY['a'], j ?& ARRAY['a'], j @? '$.a' FROM t; diff --git a/t/test-files/expected/ex88.sql b/t/test-files/expected/ex88.sql new file mode 100644 index 00000000..812edf2d --- /dev/null +++ b/t/test-files/expected/ex88.sql @@ -0,0 +1,29 @@ +-- Geometric operators starting with ? must not be split +SELECT + l1.s, + l2.s +FROM + LSEG_TBL l1, + LSEG_TBL l2 +WHERE + l1.s ?# l2.s + AND l1.s ?|| l2.s + AND l1.s ?-| l2.s; + +SELECT + s +FROM + LINE_TBL +WHERE + ?- s + AND ?| s + AND p ?- point '(0,0)'; + +SELECT + j ? 'a', + j ?| ARRAY['a'], + j ?& ARRAY['a'], + j @? '$.a' +FROM + t; +