Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 6 additions & 8 deletions .github/workflows/MainDistributionPipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
#
name: Main Extension Distribution Pipeline
on:
push:
pull_request:
workflow_dispatch:

concurrency:
Expand All @@ -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' }}
2 changes: 1 addition & 1 deletion duckdb
Submodule duckdb updated 7651 files
2 changes: 1 addition & 1 deletion extension-ci-tools
29 changes: 18 additions & 11 deletions src/sqlite_scanner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -252,25 +252,32 @@ 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;
auto has_more = stmt.Step();
if (!has_more) {
state.done = true;
output.SetCardinality(out_idx);
SetVectorSizes(out_idx);
break;
}
state.scan_count++;
for (idx_t col_idx = 0; col_idx < output.ColumnCount(); col_idx++) {
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;
}
Expand All @@ -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<int64_t>(out_vec)[out_idx] = sqlite3_value_int64(val);
FlatVector::GetDataMutable<int64_t>(out_vec)[out_idx] = sqlite3_value_int64(val);
break;
case LogicalTypeId::DOUBLE:
stmt.CheckTypeIsFloatOrInteger(val, sqlite_column_type, col_idx);
FlatVector::GetData<double>(out_vec)[out_idx] = sqlite3_value_double(val);
FlatVector::GetDataMutable<double>(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<string_t>(out_vec)[out_idx] = StringVector::AddString(
FlatVector::GetDataMutable<string_t>(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<date_t>(out_vec)[out_idx] =
FlatVector::GetDataMutable<date_t>(out_vec)[out_idx] =
Timestamp::GetDate(ConvertTimestampInteger(val));
} else if (sqlite_column_type == SQLITE_FLOAT) {
FlatVector::GetData<date_t>(out_vec)[out_idx] = Timestamp::GetDate(ConvertTimestampFloat(val));
FlatVector::GetDataMutable<date_t>(out_vec)[out_idx] = Timestamp::GetDate(ConvertTimestampFloat(val));
} else if (sqlite_column_type == SQLITE_TEXT) {
FlatVector::GetData<date_t>(out_vec)[out_idx] =
FlatVector::GetDataMutable<date_t>(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 "
Expand All @@ -317,12 +324,12 @@ static void SqliteScan(ClientContext &context, TableFunctionInput &data, DataChu
// timestamps
if (sqlite_column_type == SQLITE_INTEGER) {
// unix timestamp
FlatVector::GetData<timestamp_t>(out_vec)[out_idx] = ConvertTimestampInteger(val);
FlatVector::GetDataMutable<timestamp_t>(out_vec)[out_idx] = ConvertTimestampInteger(val);
} else if (sqlite_column_type == SQLITE_FLOAT) {
FlatVector::GetData<timestamp_t>(out_vec)[out_idx] = ConvertTimestampFloat(val);
FlatVector::GetDataMutable<timestamp_t>(out_vec)[out_idx] = ConvertTimestampFloat(val);
} else if (sqlite_column_type == SQLITE_TEXT) {
// ISO-8601
FlatVector::GetData<timestamp_t>(out_vec)[out_idx] =
FlatVector::GetDataMutable<timestamp_t>(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 "
Expand All @@ -331,7 +338,7 @@ static void SqliteScan(ClientContext &context, TableFunctionInput &data, DataChu
}
break;
case LogicalTypeId::BLOB:
FlatVector::GetData<string_t>(out_vec)[out_idx] = StringVector::AddStringOrBlob(
FlatVector::GetDataMutable<string_t>(out_vec)[out_idx] = StringVector::AddStringOrBlob(
out_vec, (const char *)sqlite3_value_blob(val), sqlite3_value_bytes(val));
break;
default:
Expand Down
1 change: 1 addition & 0 deletions src/storage/sqlite_delete.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
1 change: 1 addition & 0 deletions src/storage/sqlite_insert.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ SourceResultType SQLiteInsert::GetDataInternal(ExecutionContext &context, DataCh
auto &insert_gstate = sink_state->Cast<SQLiteInsertGlobalState>();
chunk.SetCardinality(1);
chunk.SetValue(0, 0, Value::BIGINT(insert_gstate.insert_count));
FlatVector::SetSize(chunk.data[0], count_t(1));

return SourceResultType::FINISHED;
}
Expand Down
2 changes: 1 addition & 1 deletion src/storage/sqlite_schema_entry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ optional_ptr<CatalogEntry> SQLiteSchemaEntry::CreateFunction(CatalogTransaction
}

void UnqualifyColumnReferences(ParsedExpression &expr) {
if (expr.type == ExpressionType::COLUMN_REF) {
if (expr.GetExpressionType() == ExpressionType::COLUMN_REF) {
auto &colref = expr.Cast<ColumnRefExpression>();
auto name = std::move(colref.column_names.back());
colref.column_names = {std::move(name)};
Expand Down
3 changes: 2 additions & 1 deletion src/storage/sqlite_update.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ SourceResultType SQLiteUpdate::GetDataInternal(ExecutionContext &context, DataCh
auto &insert_gstate = sink_state->Cast<SQLiteUpdateGlobalState>();
chunk.SetCardinality(1);
chunk.SetValue(0, 0, Value::BIGINT(insert_gstate.update_count));
FlatVector::SetSize(chunk.data[0], count_t(1));

return SourceResultType::FINISHED;
}
Expand All @@ -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");
}
}
Expand Down
2 changes: 2 additions & 0 deletions test/sql/storage/attach_concurrent_clients.test
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

require sqlite_scanner

require nowindows

statement ok
ATTACH '__TEST_DIR__/attach_concurrentclients.db' AS s1 (TYPE SQLITE)

Expand Down
Loading