diff --git a/.github/workflows/MainDistributionPipeline.yml b/.github/workflows/MainDistributionPipeline.yml index 935d38d..992e3d4 100644 --- a/.github/workflows/MainDistributionPipeline.yml +++ b/.github/workflows/MainDistributionPipeline.yml @@ -14,17 +14,17 @@ concurrency: jobs: duckdb-stable-build: name: Build extension binaries - uses: duckdb/extension-ci-tools/.github/workflows/_extension_distribution.yml@v1.5-variegata + uses: duckdb/extension-ci-tools/.github/workflows/_extension_distribution.yml@v2.0-cyanoptera with: - duckdb_version: v1.5.6 - ci_tools_version: v1.5-variegata + duckdb_version: v2.0.0 + ci_tools_version: v2.0-cyanoptera extension_name: duck_diff code-quality-check: name: Code Quality Check - uses: duckdb/extension-ci-tools/.github/workflows/_extension_code_quality.yml@v1.5-variegata + uses: duckdb/extension-ci-tools/.github/workflows/_extension_code_quality.yml@v2.0-cyanoptera with: - duckdb_version: v1.5.6 - ci_tools_version: v1.5-variegata + duckdb_version: v2.0.0 + ci_tools_version: v2.0-cyanoptera extension_name: duck_diff format_checks: 'format;tidy' diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index 5d23aa9..d4e787c 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -18,16 +18,16 @@ permissions: contents: write env: - DUCKDB_VERSION: v1.5.6 + DUCKDB_VERSION: v2.0.0 EXTENSION_NAME: duck_diff jobs: build: name: Build extension binaries - uses: duckdb/extension-ci-tools/.github/workflows/_extension_distribution.yml@v1.5-variegata + uses: duckdb/extension-ci-tools/.github/workflows/_extension_distribution.yml@v2.0-cyanoptera with: - duckdb_version: v1.5.6 - ci_tools_version: v1.5-variegata + duckdb_version: v2.0.0 + ci_tools_version: v2.0-cyanoptera extension_name: duck_diff exclude_archs: 'wasm_mvp;wasm_eh;wasm_threads' diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 5c453ca..9af93a2 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -70,6 +70,6 @@ Also included: ### Housekeeping -- Upgraded the bundled DuckDB to v1.5.6. +- Upgraded the bundled DuckDB to v2.0.0 (extension-ci-tools `v2.0-cyanoptera`). - `duck_diff` is now installable from the DuckDB community extension repository: `INSTALL duck_diff FROM community;` diff --git a/duckdb b/duckdb index 069cc9f..d54cbbe 160000 --- a/duckdb +++ b/duckdb @@ -1 +1 @@ -Subproject commit 069cc9f9b5be802405797faecc284961b07c70ef +Subproject commit d54cbbe3df17e8e5ce68312f483b4155836112aa diff --git a/extension-ci-tools b/extension-ci-tools index 3fd6109..b8d325c 160000 --- a/extension-ci-tools +++ b/extension-ci-tools @@ -1 +1 @@ -Subproject commit 3fd6109fc01555673b7c7123eba8d0d143fe8ce4 +Subproject commit b8d325c37e82160886579880707493bd358c0e62 diff --git a/src/duck_diff_extension.cpp b/src/duck_diff_extension.cpp index 24b9a39..a4822cf 100644 --- a/src/duck_diff_extension.cpp +++ b/src/duck_diff_extension.cpp @@ -85,7 +85,7 @@ RelationSchema InspectRelation(ClientContext &context, optional_ptr pare // The argument is a query, written as the caller would in SQL: a `FROM …` // clause or a full `SELECT … FROM …`. (A bare relation name is not a // statement and is rejected — write `FROM tbl`.) - Parser parser(context.GetParserOptions()); + Parser parser(context); try { parser.ParseQuery(relation); } catch (const std::exception &e) { @@ -102,7 +102,9 @@ RelationSchema InspectRelation(ClientContext &context, optional_ptr pare RelationSchema schema; try { auto bound = binder->Bind(*parser.statements[0]); - schema.names = bound.names; + for (auto &name : bound.names) { + schema.names.push_back(name.GetIdentifierName()); + } schema.types = bound.types; } catch (const std::exception &e) { throw BinderException("table_diff: could not resolve the %s relation (%s): %s", side, relation, e.what()); @@ -147,7 +149,7 @@ struct DiffPlan { // Look up a named parameter, returning nullptr if absent. const Value *FindParam(TableFunctionBindInput &input, const string &name) { - auto it = input.named_parameters.find(name); + auto it = input.named_parameters.find(Identifier(name)); if (it == input.named_parameters.end() || it->second.IsNull()) { return nullptr; } @@ -567,7 +569,7 @@ string BuildDiffSQL(const DiffPlan &plan, const string &status_col, const string } unique_ptr ParseSubquery(ClientContext &context, const string &sql) { - Parser parser(context.GetParserOptions()); + Parser parser(context); parser.ParseQuery(sql); if (parser.statements.size() != 1 || parser.statements[0]->type != StatementType::SELECT_STATEMENT) { throw InternalException("table_diff: generated query was not a single SELECT statement"); @@ -704,16 +706,18 @@ unique_ptr SchemaDiffBindReplace(ClientContext &context, TableFunction //===--------------------------------------------------------------------===// void AddDiffParameters(TableFunction &fun) { - fun.named_parameters["pk"] = LogicalType::ANY; // string or list - fun.named_parameters["require_matching_columns"] = LogicalType::BOOLEAN; - fun.named_parameters["upcast_types"] = LogicalType::BOOLEAN; - fun.named_parameters["columns"] = LogicalType::LIST(LogicalType::VARCHAR); - fun.named_parameters["ignore"] = LogicalType::LIST(LogicalType::VARCHAR); - fun.named_parameters["numeric_tolerance"] = LogicalType::DOUBLE; - fun.named_parameters["timestamp_precision"] = LogicalType::VARCHAR; - fun.named_parameters["null_equals_empty"] = LogicalType::BOOLEAN; - fun.named_parameters["prefix"] = LogicalType::VARCHAR; - fun.named_parameters["context"] = LogicalType::LIST(LogicalType::VARCHAR); + // All optional: a NULL default reads as "not passed" (see FindParam). + auto &sig = fun.GetSignature(); + sig.AddKeywordOnly("pk", LogicalType::ANY, Value()); // string or list + sig.AddKeywordOnly("require_matching_columns", LogicalType::BOOLEAN, Value()); + sig.AddKeywordOnly("upcast_types", LogicalType::BOOLEAN, Value()); + sig.AddKeywordOnly("columns", LogicalType::LIST(LogicalType::VARCHAR), Value()); + sig.AddKeywordOnly("ignore", LogicalType::LIST(LogicalType::VARCHAR), Value()); + sig.AddKeywordOnly("numeric_tolerance", LogicalType::DOUBLE, Value()); + sig.AddKeywordOnly("timestamp_precision", LogicalType::VARCHAR, Value()); + sig.AddKeywordOnly("null_equals_empty", LogicalType::BOOLEAN, Value()); + sig.AddKeywordOnly("prefix", LogicalType::VARCHAR, Value()); + sig.AddKeywordOnly("context", LogicalType::LIST(LogicalType::VARCHAR), Value()); } void LoadInternal(ExtensionLoader &loader) {