From ba283e07c4ae779fb99746a88528803051ce089d Mon Sep 17 00:00:00 2001 From: zipg Date: Mon, 29 Jun 2026 11:20:15 +0800 Subject: [PATCH] =?UTF-8?q?Fix:=20=E4=BF=AE=E5=A4=8D=20PostgreSQL=20?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=9D=83=E9=99=90=E8=AF=AD=E5=8F=A5=E8=AF=8A?= =?UTF-8?q?=E6=96=AD=E8=AF=AF=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/dbx-core/src/sql_analysis.rs | 10 ++++++++++ crates/dbx-core/tests/sql_analysis.rs | 13 +++++++++++++ 2 files changed, 23 insertions(+) diff --git a/crates/dbx-core/src/sql_analysis.rs b/crates/dbx-core/src/sql_analysis.rs index 90caf31640..533ce12dc9 100644 --- a/crates/dbx-core/src/sql_analysis.rs +++ b/crates/dbx-core/src/sql_analysis.rs @@ -19,6 +19,9 @@ static CLICKHOUSE_STRICTNESS_FIRST_JOIN_RE: LazyLock = LazyLock::new(|| { Regex::new(r"(?i)\b(ANY|ALL|SEMI|ANTI|ASOF)\s+(LEFT|RIGHT|FULL|INNER|CROSS)(\s+OUTER)?\s+JOIN\b") .expect("valid ClickHouse join strictness regex") }); +static POSTGRES_DEFAULT_PRIVILEGES_RE: LazyLock = LazyLock::new(|| { + Regex::new(r"(?i)^\s*ALTER\s+DEFAULT\s+PRIVILEGES\b").expect("valid PostgreSQL default privileges regex") +}); #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct SqlReferenceAnalysis { @@ -71,6 +74,9 @@ pub fn analyze_sql_references(sql: &str, dialect: Option<&str>) -> Result bool { && starts_with_executable_sql_keyword(sql, &["FROM", "SUMMARIZE", "SUMMARISE", "PIVOT", "UNPIVOT"]) } +fn starts_with_postgres_parser_gap_sql(sql: &str) -> bool { + POSTGRES_DEFAULT_PRIVILEGES_RE.is_match(sql) +} + fn normalize_clickhouse_join_order_for_parser(sql: &str) -> String { CLICKHOUSE_STRICTNESS_FIRST_JOIN_RE .replace_all(sql, |captures: ®ex::Captures<'_>| { diff --git a/crates/dbx-core/tests/sql_analysis.rs b/crates/dbx-core/tests/sql_analysis.rs index e6d4c263ab..8530fd0250 100644 --- a/crates/dbx-core/tests/sql_analysis.rs +++ b/crates/dbx-core/tests/sql_analysis.rs @@ -44,6 +44,19 @@ fn extracts_mysql_single_quoted_table_references() { assert_eq!(analysis.tables[0].schema, None); } +#[test] +fn postgres_default_privileges_statements_do_not_raise_syntax_errors() { + let sql = "\ +ALTER DEFAULT PRIVILEGES IN SCHEMA public +GRANT SELECT,INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER ON TABLES TO app_user;"; + + let analysis = analyze_sql_references(sql, Some("postgres")) + .unwrap_or_else(|error| panic!("PostgreSQL ALTER DEFAULT PRIVILEGES should analyze: {error}")); + + assert!(analysis.tables.is_empty()); + assert!(analysis.columns.is_empty()); +} + #[test] fn extracts_unqualified_order_by_columns_for_sqlserver_queries() { let analysis =