diff --git a/.github/workflows/MainDistributionPipeline.yml b/.github/workflows/MainDistributionPipeline.yml index 47719ec..e4bf6c8 100644 --- a/.github/workflows/MainDistributionPipeline.yml +++ b/.github/workflows/MainDistributionPipeline.yml @@ -3,8 +3,6 @@ # name: Main Extension Distribution Pipeline on: - push: - pull_request: workflow_dispatch: concurrency: @@ -14,22 +12,22 @@ 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@main with: - duckdb_version: v1.5.3 + duckdb_version: main extension_name: sqlite_scanner - ci_tools_version: v1.5-variegata + ci_tools_version: main opt_in_archs: 'linux_amd64_musl;linux_arm64_musl;windows_arm64' duckdb-stable-deploy: name: Deploy extension binaries needs: duckdb-stable-build - uses: duckdb/extension-ci-tools/.github/workflows/_extension_deploy.yml@v1.5-variegata + uses: duckdb/extension-ci-tools/.github/workflows/_extension_deploy.yml@main secrets: inherit with: - duckdb_version: v1.5.3 + duckdb_version: main extension_name: sqlite_scanner - ci_tools_version: v1.5-variegata + ci_tools_version: main opt_in_archs: 'linux_amd64_musl;linux_arm64_musl;windows_arm64' deploy_latest: ${{ startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main' }} deploy_versioned: ${{ startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main' }} diff --git a/duckdb b/duckdb index 14eca11..80554e9 160000 --- a/duckdb +++ b/duckdb @@ -1 +1 @@ -Subproject commit 14eca11bd9d4a0de2ea0f078be588a9c1c5b279c +Subproject commit 80554e9433d6dd2dd3808b56f9898246fc25e365 diff --git a/extension-ci-tools b/extension-ci-tools index 4b3b37b..a4373c6 160000 --- a/extension-ci-tools +++ b/extension-ci-tools @@ -1 +1 @@ -Subproject commit 4b3b37b0c9de00da54e1765d65abfea3f94617f4 +Subproject commit a4373c6ec5bfcf4e0ec2f89b50248eefd0d8f2c7 diff --git a/src/sqlite_scanner.cpp b/src/sqlite_scanner.cpp index 91b7180..4268928 100644 --- a/src/sqlite_scanner.cpp +++ b/src/sqlite_scanner.cpp @@ -252,10 +252,16 @@ static void SqliteScan(ClientContext &context, TableFunctionInput &data, DataChu } } + auto SetVectorSizes = [&](idx_t count) { + for (idx_t col_idx = 0; col_idx < output.ColumnCount(); col_idx++) { + FlatVector::SetSize(output.data[col_idx], count_t(count)); + } + }; idx_t out_idx = 0; while (true) { if (out_idx == STANDARD_VECTOR_SIZE) { output.SetCardinality(out_idx); + SetVectorSizes(out_idx); return; } auto &stmt = state.stmt; @@ -263,6 +269,7 @@ static void SqliteScan(ClientContext &context, TableFunctionInput &data, DataChu if (!has_more) { state.done = true; output.SetCardinality(out_idx); + SetVectorSizes(out_idx); break; } state.scan_count++; @@ -270,7 +277,7 @@ static void SqliteScan(ClientContext &context, TableFunctionInput &data, DataChu auto &out_vec = output.data[col_idx]; auto sqlite_column_type = stmt.GetType(col_idx); if (sqlite_column_type == SQLITE_NULL) { - auto &mask = FlatVector::Validity(out_vec); + auto &mask = FlatVector::ValidityMutable(out_vec); mask.Set(out_idx, false); continue; } @@ -279,26 +286,26 @@ static void SqliteScan(ClientContext &context, TableFunctionInput &data, DataChu switch (out_vec.GetType().id()) { case LogicalTypeId::BIGINT: stmt.CheckTypeMatches(bind_data, val, sqlite_column_type, SQLITE_INTEGER, col_idx); - FlatVector::GetData(out_vec)[out_idx] = sqlite3_value_int64(val); + FlatVector::GetDataMutable(out_vec)[out_idx] = sqlite3_value_int64(val); break; case LogicalTypeId::DOUBLE: stmt.CheckTypeIsFloatOrInteger(val, sqlite_column_type, col_idx); - FlatVector::GetData(out_vec)[out_idx] = sqlite3_value_double(val); + FlatVector::GetDataMutable(out_vec)[out_idx] = sqlite3_value_double(val); break; case LogicalTypeId::VARCHAR: stmt.CheckTypeMatches(bind_data, val, sqlite_column_type, SQLITE_TEXT, col_idx); - FlatVector::GetData(out_vec)[out_idx] = StringVector::AddString( + FlatVector::GetDataMutable(out_vec)[out_idx] = StringVector::AddString( out_vec, (const char *)sqlite3_value_text(val), sqlite3_value_bytes(val)); break; case LogicalTypeId::DATE: if (sqlite_column_type == SQLITE_INTEGER) { // unix timestamp - FlatVector::GetData(out_vec)[out_idx] = + FlatVector::GetDataMutable(out_vec)[out_idx] = Timestamp::GetDate(ConvertTimestampInteger(val)); } else if (sqlite_column_type == SQLITE_FLOAT) { - FlatVector::GetData(out_vec)[out_idx] = Timestamp::GetDate(ConvertTimestampFloat(val)); + FlatVector::GetDataMutable(out_vec)[out_idx] = Timestamp::GetDate(ConvertTimestampFloat(val)); } else if (sqlite_column_type == SQLITE_TEXT) { - FlatVector::GetData(out_vec)[out_idx] = + FlatVector::GetDataMutable(out_vec)[out_idx] = Date::FromCString((const char *)sqlite3_value_text(val), sqlite3_value_bytes(val)); } else { throw NotImplementedException("Unimplemented SQLite type for column of type DATE\n* SET " @@ -317,12 +324,12 @@ static void SqliteScan(ClientContext &context, TableFunctionInput &data, DataChu // timestamps if (sqlite_column_type == SQLITE_INTEGER) { // unix timestamp - FlatVector::GetData(out_vec)[out_idx] = ConvertTimestampInteger(val); + FlatVector::GetDataMutable(out_vec)[out_idx] = ConvertTimestampInteger(val); } else if (sqlite_column_type == SQLITE_FLOAT) { - FlatVector::GetData(out_vec)[out_idx] = ConvertTimestampFloat(val); + FlatVector::GetDataMutable(out_vec)[out_idx] = ConvertTimestampFloat(val); } else if (sqlite_column_type == SQLITE_TEXT) { // ISO-8601 - FlatVector::GetData(out_vec)[out_idx] = + FlatVector::GetDataMutable(out_vec)[out_idx] = Timestamp::FromCString((const char *)sqlite3_value_text(val), sqlite3_value_bytes(val)); } else { throw NotImplementedException("Unimplemented SQLite type for column of type TIMESTAMP\n* SET " @@ -331,7 +338,7 @@ static void SqliteScan(ClientContext &context, TableFunctionInput &data, DataChu } break; case LogicalTypeId::BLOB: - FlatVector::GetData(out_vec)[out_idx] = StringVector::AddStringOrBlob( + FlatVector::GetDataMutable(out_vec)[out_idx] = StringVector::AddStringOrBlob( out_vec, (const char *)sqlite3_value_blob(val), sqlite3_value_bytes(val)); break; default: diff --git a/src/storage/sqlite_delete.cpp b/src/storage/sqlite_delete.cpp index 2409c46..09c3dba 100644 --- a/src/storage/sqlite_delete.cpp +++ b/src/storage/sqlite_delete.cpp @@ -80,6 +80,7 @@ SourceResultType SQLiteDelete::GetDataInternal(ExecutionContext &context, DataCh } chunk.SetCardinality(1); chunk.SetValue(0, 0, Value::BIGINT(insert_gstate.delete_count)); + FlatVector::SetSize(chunk.data[0], count_t(1)); return SourceResultType::FINISHED; } diff --git a/src/storage/sqlite_insert.cpp b/src/storage/sqlite_insert.cpp index 95c4e39..44502ef 100644 --- a/src/storage/sqlite_insert.cpp +++ b/src/storage/sqlite_insert.cpp @@ -122,6 +122,7 @@ SourceResultType SQLiteInsert::GetDataInternal(ExecutionContext &context, DataCh auto &insert_gstate = sink_state->Cast(); chunk.SetCardinality(1); chunk.SetValue(0, 0, Value::BIGINT(insert_gstate.insert_count)); + FlatVector::SetSize(chunk.data[0], count_t(1)); return SourceResultType::FINISHED; } diff --git a/src/storage/sqlite_schema_entry.cpp b/src/storage/sqlite_schema_entry.cpp index d0b7fa3..593f388 100644 --- a/src/storage/sqlite_schema_entry.cpp +++ b/src/storage/sqlite_schema_entry.cpp @@ -70,7 +70,7 @@ optional_ptr SQLiteSchemaEntry::CreateFunction(CatalogTransaction } void UnqualifyColumnReferences(ParsedExpression &expr) { - if (expr.type == ExpressionType::COLUMN_REF) { + if (expr.GetExpressionType() == ExpressionType::COLUMN_REF) { auto &colref = expr.Cast(); auto name = std::move(colref.column_names.back()); colref.column_names = {std::move(name)}; diff --git a/src/storage/sqlite_update.cpp b/src/storage/sqlite_update.cpp index f49b4ea..29ab390 100644 --- a/src/storage/sqlite_update.cpp +++ b/src/storage/sqlite_update.cpp @@ -85,6 +85,7 @@ SourceResultType SQLiteUpdate::GetDataInternal(ExecutionContext &context, DataCh auto &insert_gstate = sink_state->Cast(); chunk.SetCardinality(1); chunk.SetValue(0, 0, Value::BIGINT(insert_gstate.update_count)); + FlatVector::SetSize(chunk.data[0], count_t(1)); return SourceResultType::FINISHED; } @@ -111,7 +112,7 @@ PhysicalOperator &SQLiteCatalog::PlanUpdate(ClientContext &context, PhysicalPlan throw BinderException("RETURNING clause not yet supported for updates of a SQLite table"); } for (auto &expr : op.expressions) { - if (expr->type == ExpressionType::VALUE_DEFAULT) { + if (expr->GetExpressionType() == ExpressionType::VALUE_DEFAULT) { throw BinderException("SET DEFAULT is not yet supported for updates of a SQLite table"); } } diff --git a/test/sql/storage/attach_concurrent_clients.test b/test/sql/storage/attach_concurrent_clients.test index 42cea50..cce5237 100644 --- a/test/sql/storage/attach_concurrent_clients.test +++ b/test/sql/storage/attach_concurrent_clients.test @@ -4,6 +4,8 @@ require sqlite_scanner +require nowindows + statement ok ATTACH '__TEST_DIR__/attach_concurrentclients.db' AS s1 (TYPE SQLITE)