Skip to content

Commit cd9f2f5

Browse files
committed
Allow subextensions to use DuckDB execution
1 parent 55874e3 commit cd9f2f5

File tree

6 files changed

+55
-24
lines changed

6 files changed

+55
-24
lines changed

include/pgduckdb/pgduckdb_ruleutils.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ char *pgduckdb_get_tabledef(Oid relation_id);
1515
char *pgduckdb_get_alter_tabledef(Oid relation_oid, AlterTableStmt *alter_stmt);
1616
char *pgduckdb_get_rename_relationdef(Oid relation_oid, RenameStmt *rename_stmt);
1717
bool pgduckdb_is_not_default_expr(Node *node, void *context);
18-
List *pgduckdb_db_and_schema(const char *postgres_schema_name, bool is_duckdb_table);
19-
const char *pgduckdb_db_and_schema_string(const char *postgres_schema_name, bool is_duckdb_table);
18+
List *pgduckdb_db_and_schema(const char *postgres_schema_name, const char *duckdb_table_am_name);
19+
const char *pgduckdb_db_and_schema_string(const char *postgres_schema_name, const char *duckdb_table_am_name);
2020
bool pgduckdb_is_duckdb_row(Oid type_oid);
2121
bool pgduckdb_is_unresolved_type(Oid type_oid);
2222
bool pgduckdb_is_fake_type(Oid type_oid);

include/pgduckdb/pgduckdb_table_am.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,8 @@
22

33
namespace pgduckdb {
44
bool IsDuckdbTableAm(const TableAmRoutine *am);
5-
}
5+
6+
const char *DuckdbTableAmGetName(const TableAmRoutine *am);
7+
8+
const char *DuckdbTableAmGetName(Oid relid);
9+
} // namespace pgduckdb

src/pgduckdb_ddl.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -968,7 +968,7 @@ DuckdbHandleViewStmtPre(Node *parsetree, PlannedStmt *pstmt, const char *query_s
968968
/* END OF COPIED LOGIC */
969969

970970
char *duckdb_query_string = pgduckdb_get_querydef((Query *)copyObjectImpl(viewParse));
971-
List *db_and_schema = pgduckdb_db_and_schema(schema_name, true);
971+
List *db_and_schema = pgduckdb_db_and_schema(schema_name, "duckdb");
972972

973973
char *duckdb_db = (char *)linitial(db_and_schema);
974974
char *duckdb_schema = (char *)lsecond(db_and_schema);
@@ -1002,7 +1002,7 @@ DuckdbHandleViewStmtPost(Node *parsetree) {
10021002
auto default_db = pgduckdb::DuckDBManager::Get().GetDefaultDBName();
10031003
char *postgres_schema_name = get_namespace_name(rel->rd_rel->relnamespace);
10041004

1005-
const char *duckdb_db = (const char *)linitial(pgduckdb_db_and_schema(postgres_schema_name, true));
1005+
const char *duckdb_db = (const char *)linitial(pgduckdb_db_and_schema(postgres_schema_name, "duckdb"));
10061006
relation_close(rel, NoLock);
10071007

10081008
Oid arg_types[] = {OIDOID, TEXTOID, TEXTOID, TEXTOID};
@@ -1294,7 +1294,7 @@ DECLARE_PG_FUNCTION(duckdb_create_table_trigger) {
12941294
Oid saved_userid;
12951295
int sec_context;
12961296
const char *postgres_schema_name = get_namespace_name_or_temp(get_rel_namespace(relid));
1297-
const char *duckdb_db = (const char *)linitial(pgduckdb_db_and_schema(postgres_schema_name, true));
1297+
const char *duckdb_db = (const char *)linitial(pgduckdb_db_and_schema(postgres_schema_name, "duckdb"));
12981298
auto default_db = pgduckdb::DuckDBManager::Get().GetDefaultDBName();
12991299

13001300
Oid arg_types[] = {OIDOID, TEXTOID, TEXTOID, TEXTOID};
@@ -1588,7 +1588,7 @@ DECLARE_PG_FUNCTION(duckdb_drop_trigger) {
15881588
char *object_type = SPI_getvalue(tuple, SPI_tuptable->tupdesc, 3);
15891589
char *drop_query =
15901590
psprintf("DROP %s IF EXISTS %s.%s", object_type,
1591-
pgduckdb_db_and_schema_string(postgres_schema_name, true), quote_identifier(table_name));
1591+
pgduckdb_db_and_schema_string(postgres_schema_name, "duckdb"), quote_identifier(table_name));
15921592
pgduckdb::DuckDBQueryOrThrow(*connection, drop_query);
15931593

15941594
deleted_duckdb_relations++;

src/pgduckdb_hooks.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,7 @@ ContainsCatalogTable(List *rtes) {
6666

6767
static bool
6868
IsDuckdbTable(Oid relid) {
69-
if (relid == InvalidOid) {
70-
return false;
71-
}
72-
73-
auto rel = RelationIdGetRelation(relid);
74-
bool result = pgduckdb::IsDuckdbTableAm(rel->rd_tableam);
75-
RelationClose(rel);
76-
return result;
69+
return pgduckdb::DuckdbTableAmGetName(relid) != nullptr;
7770
}
7871

7972
static bool

src/pgduckdb_ruleutils.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -472,11 +472,15 @@ pgduckdb_write_row_refname(StringInfo buf, char *refname, bool is_top_level) {
472472
* are not escaped yet.
473473
*/
474474
List *
475-
pgduckdb_db_and_schema(const char *postgres_schema_name, bool is_duckdb_table) {
476-
if (!is_duckdb_table) {
475+
pgduckdb_db_and_schema(const char *postgres_schema_name, const char *duckdb_table_am_name) {
476+
if (duckdb_table_am_name == nullptr) {
477477
return list_make2((void *)"pgduckdb", (void *)postgres_schema_name);
478478
}
479479

480+
if (strcmp("duckdb", duckdb_table_am_name) != 0) {
481+
return list_make2((void *)duckdb_table_am_name, (void *)postgres_schema_name);
482+
}
483+
480484
if (strcmp("pg_temp", postgres_schema_name) == 0) {
481485
return list_make2((void *)"pg_temp", (void *)"main");
482486
}
@@ -538,8 +542,8 @@ pgduckdb_db_and_schema(const char *postgres_schema_name, bool is_duckdb_table) {
538542
* database are quoted if necessary.
539543
*/
540544
const char *
541-
pgduckdb_db_and_schema_string(const char *postgres_schema_name, bool is_duckdb_table) {
542-
List *db_and_schema = pgduckdb_db_and_schema(postgres_schema_name, is_duckdb_table);
545+
pgduckdb_db_and_schema_string(const char *postgres_schema_name, const char *duckdb_table_am_name) {
546+
List *db_and_schema = pgduckdb_db_and_schema(postgres_schema_name, duckdb_table_am_name);
543547
const char *db_name = (const char *)linitial(db_and_schema);
544548
const char *schema_name = (const char *)lsecond(db_and_schema);
545549
return psprintf("%s.%s", quote_identifier(db_name), quote_identifier(schema_name));
@@ -558,9 +562,9 @@ pgduckdb_relation_name(Oid relation_oid) {
558562
Form_pg_class relation = (Form_pg_class)GETSTRUCT(tp);
559563
const char *relname = NameStr(relation->relname);
560564
const char *postgres_schema_name = get_namespace_name_or_temp(relation->relnamespace);
561-
bool is_duckdb_table = pgduckdb::IsDuckdbTable(relation);
565+
const char *duckdb_table_am_name = pgduckdb::DuckdbTableAmGetName(relation_oid);
562566

563-
const char *db_and_schema = pgduckdb_db_and_schema_string(postgres_schema_name, is_duckdb_table);
567+
const char *db_and_schema = pgduckdb_db_and_schema_string(postgres_schema_name, duckdb_table_am_name);
564568

565569
char *result = psprintf("%s.%s", db_and_schema, quote_identifier(relname));
566570

@@ -611,7 +615,8 @@ pgduckdb_get_tabledef(Oid relation_oid) {
611615
Relation relation = relation_open(relation_oid, AccessShareLock);
612616
const char *relation_name = pgduckdb_relation_name(relation_oid);
613617
const char *postgres_schema_name = get_namespace_name_or_temp(relation->rd_rel->relnamespace);
614-
const char *db_and_schema = pgduckdb_db_and_schema_string(postgres_schema_name, pgduckdb::IsDuckdbTable(relation));
618+
const char *duckdb_table_am_name = pgduckdb::DuckdbTableAmGetName(relation->rd_tableam);
619+
const char *db_and_schema = pgduckdb_db_and_schema_string(postgres_schema_name, duckdb_table_am_name);
615620

616621
StringInfoData buffer;
617622
initStringInfo(&buffer);
@@ -799,7 +804,7 @@ pgduckdb_get_viewdef(const ViewStmt *stmt, const char *postgres_schema_name, con
799804
StringInfoData buffer;
800805
initStringInfo(&buffer);
801806

802-
const char *db_and_schema = pgduckdb_db_and_schema_string(postgres_schema_name, true);
807+
const char *db_and_schema = pgduckdb_db_and_schema_string(postgres_schema_name, "duckdb");
803808
appendStringInfo(&buffer, "CREATE SCHEMA IF NOT EXISTS %s; ", db_and_schema);
804809

805810
appendStringInfoString(&buffer, "CREATE ");
@@ -879,7 +884,7 @@ pgduckdb_get_rename_relationdef(Oid relation_oid, RenameStmt *rename_stmt) {
879884
Assert(pgduckdb::IsDuckdbTable(relation) || pgduckdb::IsMotherDuckView(relation));
880885

881886
const char *postgres_schema_name = get_namespace_name_or_temp(relation->rd_rel->relnamespace);
882-
const char *db_and_schema = pgduckdb_db_and_schema_string(postgres_schema_name, true);
887+
const char *db_and_schema = pgduckdb_db_and_schema_string(postgres_schema_name, "duckdb");
883888
const char *old_table_name = psprintf("%s.%s", db_and_schema, quote_identifier(rename_stmt->relation->relname));
884889

885890
const char *relation_type = "TABLE";

src/pgduckdb_table_am.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
* Portions Copyright (c) 1994, Regents of the University of California
1111
*/
1212

13+
#include "duckdb/common/string.hpp"
14+
#include "duckdb/common/unordered_map.hpp"
15+
1316
#include "pgduckdb/pgduckdb_ddl.hpp"
1417

1518
extern "C" {
@@ -492,9 +495,35 @@ duckdb_am_handler(FunctionCallInfo /*funcinfo*/) {
492495
}
493496
}
494497

498+
static duckdb::unordered_map<const TableAmRoutine * /*am*/, duckdb::string /*name*/> duckdb_table_ams = {
499+
{&duckdb_methods, "duckdb"}};
500+
501+
extern "C" __attribute__((visibility("default"))) void
502+
RegisterDuckdbTableAm(const char *name, const TableAmRoutine *am) {
503+
duckdb_table_ams[am] = name;
504+
}
505+
495506
namespace pgduckdb {
496507
bool
497508
IsDuckdbTableAm(const TableAmRoutine *am) {
498509
return am == &duckdb_methods;
499510
}
511+
512+
const char *
513+
DuckdbTableAmGetName(const TableAmRoutine *am) {
514+
auto it = duckdb_table_ams.find(am);
515+
return it == duckdb_table_ams.end() ? nullptr : it->second.c_str();
516+
}
517+
518+
const char *
519+
DuckdbTableAmGetName(Oid relid) {
520+
if (relid == InvalidOid) {
521+
return nullptr;
522+
}
523+
524+
auto rel = RelationIdGetRelation(relid);
525+
const char *name = DuckdbTableAmGetName(rel->rd_tableam);
526+
RelationClose(rel);
527+
return name;
528+
}
500529
} // namespace pgduckdb

0 commit comments

Comments
 (0)