From 957e970d8562565e82e92164c1637c6c7c291370 Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Sun, 12 Jan 2025 10:34:19 +0100 Subject: [PATCH 1/3] feat: parse postgres trigram operators See https://www.postgresql.org/docs/current/pgtrgm.html Fixes #1161 --- crates/lib-dialects/src/postgres.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/crates/lib-dialects/src/postgres.rs b/crates/lib-dialects/src/postgres.rs index d5300650f..87865292e 100644 --- a/crates/lib-dialects/src/postgres.rs +++ b/crates/lib-dialects/src/postgres.rs @@ -58,6 +58,11 @@ pub fn raw_dialect() -> Dialect { r#"->>|#>>|->|#>|@>|<@|\?\||\?|\?&|#-"#, SyntaxKind::JsonOperator ), + Matcher::regex( + "trgm_operator", + r#"%|<%|%>|<<%|%>>|<->|<<->|<->>|<<<->|<->>>"#, + SyntaxKind::LikeOperator + ), Matcher::string( "at", "@", From f6714d88893e38e51e158ce9829eae950e9396c8 Mon Sep 17 00:00:00 2001 From: Andrey Nikolaev Date: Sun, 26 Jan 2025 08:35:45 -0800 Subject: [PATCH 2/3] fix: fix regex for SQL-like operators with proper precedence handling --- crates/lib-dialects/src/postgres.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/lib-dialects/src/postgres.rs b/crates/lib-dialects/src/postgres.rs index 87865292e..ae7ad3a5f 100644 --- a/crates/lib-dialects/src/postgres.rs +++ b/crates/lib-dialects/src/postgres.rs @@ -60,7 +60,7 @@ pub fn raw_dialect() -> Dialect { ), Matcher::regex( "trgm_operator", - r#"%|<%|%>|<<%|%>>|<->|<<->|<->>|<<<->|<->>>"#, + r#"(<<<->|<->>>|<<->|<->>|<->|<<%|%>>|%>|<%|%)"#, SyntaxKind::LikeOperator ), Matcher::string( From 409b6dee56c6fecad0e018efbf1c6f6d5260505d Mon Sep 17 00:00:00 2001 From: gvozdvmozgu Date: Sun, 26 Jan 2025 08:41:14 -0800 Subject: [PATCH 3/3] test: add SQL test cases for PostgreSQL trigram operators --- .../fixtures/dialects/postgres/pgtrgm.sql | 10 ++ .../fixtures/dialects/postgres/pgtrgm.yml | 121 ++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 crates/lib-dialects/test/fixtures/dialects/postgres/pgtrgm.sql create mode 100644 crates/lib-dialects/test/fixtures/dialects/postgres/pgtrgm.yml diff --git a/crates/lib-dialects/test/fixtures/dialects/postgres/pgtrgm.sql b/crates/lib-dialects/test/fixtures/dialects/postgres/pgtrgm.sql new file mode 100644 index 000000000..7ec9f5c7b --- /dev/null +++ b/crates/lib-dialects/test/fixtures/dialects/postgres/pgtrgm.sql @@ -0,0 +1,10 @@ +SELECT text % text; +SELECT text <% text; +SELECT text %> text; +SELECT text <<% text; +SELECT text %>> text; +SELECT text <-> text; +SELECT text <<-> text; +SELECT text <->> text; +SELECT text <<<-> text; +SELECT text <->>> text; diff --git a/crates/lib-dialects/test/fixtures/dialects/postgres/pgtrgm.yml b/crates/lib-dialects/test/fixtures/dialects/postgres/pgtrgm.yml new file mode 100644 index 000000000..0e032a56d --- /dev/null +++ b/crates/lib-dialects/test/fixtures/dialects/postgres/pgtrgm.yml @@ -0,0 +1,121 @@ +file: +- statement: + - select_statement: + - select_clause: + - keyword: SELECT + - select_clause_element: + - expression: + - column_reference: + - naked_identifier: text + - binary_operator: '%' + - column_reference: + - naked_identifier: text +- statement_terminator: ; +- statement: + - select_statement: + - select_clause: + - keyword: SELECT + - select_clause_element: + - expression: + - column_reference: + - naked_identifier: text + - comparison_operator: <% + - column_reference: + - naked_identifier: text +- statement_terminator: ; +- statement: + - select_statement: + - select_clause: + - keyword: SELECT + - select_clause_element: + - expression: + - column_reference: + - naked_identifier: text + - comparison_operator: '%>' + - column_reference: + - naked_identifier: text +- statement_terminator: ; +- statement: + - select_statement: + - select_clause: + - keyword: SELECT + - select_clause_element: + - expression: + - column_reference: + - naked_identifier: text + - comparison_operator: <<% + - column_reference: + - naked_identifier: text +- statement_terminator: ; +- statement: + - select_statement: + - select_clause: + - keyword: SELECT + - select_clause_element: + - expression: + - column_reference: + - naked_identifier: text + - comparison_operator: '%>>' + - column_reference: + - naked_identifier: text +- statement_terminator: ; +- statement: + - select_statement: + - select_clause: + - keyword: SELECT + - select_clause_element: + - expression: + - column_reference: + - naked_identifier: text + - comparison_operator: <-> + - column_reference: + - naked_identifier: text +- statement_terminator: ; +- statement: + - select_statement: + - select_clause: + - keyword: SELECT + - select_clause_element: + - expression: + - column_reference: + - naked_identifier: text + - comparison_operator: <<-> + - column_reference: + - naked_identifier: text +- statement_terminator: ; +- statement: + - select_statement: + - select_clause: + - keyword: SELECT + - select_clause_element: + - expression: + - column_reference: + - naked_identifier: text + - comparison_operator: <->> + - column_reference: + - naked_identifier: text +- statement_terminator: ; +- statement: + - select_statement: + - select_clause: + - keyword: SELECT + - select_clause_element: + - expression: + - column_reference: + - naked_identifier: text + - comparison_operator: <<<-> + - column_reference: + - naked_identifier: text +- statement_terminator: ; +- statement: + - select_statement: + - select_clause: + - keyword: SELECT + - select_clause_element: + - expression: + - column_reference: + - naked_identifier: text + - comparison_operator: <->>> + - column_reference: + - naked_identifier: text +- statement_terminator: ;