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 =