Skip to content

Commit 4573ff0

Browse files
YuweiXiaoYuwei Xiaoqianzhen0JelteF
authored
Harden IsExtensionRegistered by checking txn state & Reset DuckDB context if the extension is not registered (#871)
Fix #870 --------- Co-authored-by: Yuwei Xiao <qianzhen@leadincloud.com> Co-authored-by: YuweiXIAO <qianzhen@zbyte-inc.com> Co-authored-by: Jelte Fennema-Nio <jelte@motherduck.com>
1 parent 5d539bd commit 4573ff0

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

src/pgduckdb_guc.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -252,16 +252,18 @@ find_option(const char *name, bool, bool, int) {
252252

253253
static void
254254
DuckAssignTimezone_Cpp(const char *tz) {
255-
if (IsExtensionRegistered()) {
256-
if (!DuckDBManager::IsInitialized()) {
257-
return;
258-
}
255+
if (!IsExtensionRegistered()) {
256+
return;
257+
}
259258

260-
// update duckdb tz
261-
auto connection = pgduckdb::DuckDBManager::GetConnection(false);
262-
pgduckdb::DuckDBQueryOrThrow(*connection, "SET TimeZone =" + duckdb::KeywordHelper::WriteQuoted(tz));
263-
elog(DEBUG2, "[PGDuckDB] Set DuckDB option: 'TimeZone'=%s", tz);
259+
if (!DuckDBManager::IsInitialized()) {
260+
return;
264261
}
262+
263+
// update duckdb tz
264+
auto connection = pgduckdb::DuckDBManager::GetConnection(false);
265+
pgduckdb::DuckDBQueryOrThrow(*connection, "SET TimeZone =" + duckdb::KeywordHelper::WriteQuoted(tz));
266+
elog(DEBUG2, "[PGDuckDB] Set DuckDB option: 'TimeZone'=%s", tz);
265267
}
266268

267269
static void

src/pgduckdb_metadata_cache.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#include "pgduckdb/pgduckdb_duckdb.hpp"
2+
13
extern "C" {
24
#include "postgres.h"
35

@@ -214,6 +216,8 @@ IsExtensionRegistered() {
214216
elog(WARNING, "pgduckdb: IsExtensionRegistered called in an aborted transaction");
215217
/* We need to run `get_extension_oid` in a valid transaction */
216218
return false;
219+
} else if (!IsTransactionState()) {
220+
return false;
217221
} else if (!ActiveSnapshotSet() && ActivePortal == nullptr) {
218222
/* We're not in a transaction block, so we can't populate the cache */
219223
return get_extension_oid("pg_duckdb", true) != InvalidOid;
@@ -273,6 +277,14 @@ IsExtensionRegistered() {
273277
cache.postgres_role_oid = BOOTSTRAP_SUPERUSERID;
274278
}
275279
} else {
280+
/*
281+
* It's possible that a duckdb instance is still running, after we have
282+
* dropped the extension (possibly in a different session). This seems
283+
* like a good moment to clean that up if that's the case.
284+
*/
285+
if (pgduckdb::DuckDBManager::IsInitialized()) {
286+
pgduckdb::DuckDBManager::Get().Reset();
287+
}
276288
elog(DEBUG1, "pgduckdb: extension is not registered in database '%s'", get_database_name(MyDatabaseId));
277289
}
278290

0 commit comments

Comments
 (0)