From 393eeb8649a2e2752012e3ea7b4d287a53eea74f Mon Sep 17 00:00:00 2001 From: Alexander Plavin Date: Fri, 30 Aug 2024 11:07:49 -0400 Subject: [PATCH] support duckdb --- src/dialects.jl | 9 ++++++++- src/reflect.jl | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/dialects.jl b/src/dialects.jl index 6bc22ac5..d39915db 100644 --- a/src/dialects.jl +++ b/src/dialects.jl @@ -151,6 +151,11 @@ const postgresql_dialect = limit_style = LIMIT_STYLE.POSTGRESQL, variable_prefix = '$', variable_style = VARIABLE_STYLE.NUMBERED) +const duckdb_dialect = + SQLDialect(name = :duckdb, + limit_style = LIMIT_STYLE.POSTGRESQL, + variable_prefix = '$', + variable_style = VARIABLE_STYLE.NUMBERED) const redshift_dialect = SQLDialect(name = :redshift, concat_operator = Symbol("||"), @@ -187,7 +192,8 @@ const standard_dialects = [ spark_dialect, sqlite_dialect, sqlserver_dialect, - default_dialect] + default_dialect, + duckdb_dialect] function SQLDialect(name::Symbol; kws...) for sd in standard_dialects @@ -210,6 +216,7 @@ const known_connection_types = [ [:MySQL, :Connection] => :mysql, [:LibPQ, :Connection] => :postgresql, [:SQLite, :DB] => :sqlite, + [:DuckDB, :DB] => :duckdb, ] function SQLDialect(@nospecialize ConnType::Type) diff --git a/src/reflect.jl b/src/reflect.jl index 417fe69e..900dc3de 100644 --- a/src/reflect.jl +++ b/src/reflect.jl @@ -26,6 +26,19 @@ const postgresql_reflect_clause = SELECT(:schema => (:n, :nspname), :name => (:c, :relname), :column => (:a, :attname)) +# same as postgresql, just the default schema is "main" instead of "public": +const duckdb_reflect_clause = + FROM(:n => (:pg_catalog, :pg_namespace)) |> + JOIN(:c => (:pg_catalog, :pg_class), on = FUN("=", (:n, :oid), (:c, :relnamespace))) |> + JOIN(:a => (:pg_catalog, :pg_attribute), on = FUN("=", (:c, :oid), (:a, :attrelid))) |> + WHERE(FUN(:and, FUN("=", (:n, :nspname), FUN(:coalesce, VAR(:schema), "main")), + FUN(:in, (:c, :relkind), "r", "v"), + FUN(">", (:a, :attnum), 0), + FUN(:not, (:a, :attisdropped)))) |> + ORDER((:n, :nspname), (:c, :relname), (:a, :attnum)) |> + SELECT(:schema => (:n, :nspname), + :name => (:c, :relname), + :column => (:a, :attname)) const redshift_reflect_clause = postgresql_reflect_clause const sqlite_reflect_clause = FROM(:sm => :sqlite_master) |> @@ -49,6 +62,7 @@ const sqlserver_reflect_clause = const standard_reflect_clauses = [ :mysql => mysql_reflect_clause, :postgresql => postgresql_reflect_clause, + :duckdb => duckdb_reflect_clause, :redshift => redshift_reflect_clause, :sqlite => sqlite_reflect_clause, :sqlserver => sqlserver_reflect_clause]