duckdb 1.4.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/duckdb/extension/core_functions/scalar/generic/current_setting.cpp +1 -4
- package/src/duckdb/extension/icu/icu-strptime.cpp +2 -1
- package/src/duckdb/extension/json/include/json_common.hpp +2 -4
- package/src/duckdb/extension/json/json_functions.cpp +5 -1
- package/src/duckdb/extension/parquet/column_writer.cpp +31 -21
- package/src/duckdb/extension/parquet/geo_parquet.cpp +21 -6
- package/src/duckdb/extension/parquet/include/column_writer.hpp +2 -2
- package/src/duckdb/extension/parquet/include/geo_parquet.hpp +28 -1
- package/src/duckdb/extension/parquet/include/parquet_writer.hpp +7 -2
- package/src/duckdb/extension/parquet/include/reader/string_column_reader.hpp +13 -0
- package/src/duckdb/extension/parquet/include/writer/array_column_writer.hpp +4 -0
- package/src/duckdb/extension/parquet/parquet_extension.cpp +56 -1
- package/src/duckdb/extension/parquet/parquet_reader.cpp +4 -1
- package/src/duckdb/extension/parquet/parquet_statistics.cpp +5 -7
- package/src/duckdb/extension/parquet/parquet_writer.cpp +15 -8
- package/src/duckdb/extension/parquet/reader/string_column_reader.cpp +17 -4
- package/src/duckdb/extension/parquet/writer/array_column_writer.cpp +22 -28
- package/src/duckdb/extension/parquet/writer/primitive_column_writer.cpp +17 -5
- package/src/duckdb/extension/parquet/writer/struct_column_writer.cpp +3 -2
- package/src/duckdb/src/catalog/catalog_search_path.cpp +2 -2
- package/src/duckdb/src/catalog/catalog_set.cpp +1 -2
- package/src/duckdb/src/common/enum_util.cpp +20 -0
- package/src/duckdb/src/common/file_system.cpp +0 -30
- package/src/duckdb/src/common/sorting/sort.cpp +25 -6
- package/src/duckdb/src/common/sorting/sorted_run_merger.cpp +1 -0
- package/src/duckdb/src/common/string_util.cpp +24 -0
- package/src/duckdb/src/common/virtual_file_system.cpp +59 -10
- package/src/duckdb/src/execution/index/art/art_merger.cpp +0 -3
- package/src/duckdb/src/execution/index/art/prefix.cpp +4 -0
- package/src/duckdb/src/execution/operator/csv_scanner/scanner/string_value_scanner.cpp +1 -1
- package/src/duckdb/src/execution/operator/helper/physical_reset.cpp +2 -2
- package/src/duckdb/src/execution/operator/schema/physical_attach.cpp +1 -1
- package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +3 -3
- package/src/duckdb/src/function/table/system/duckdb_connection_count.cpp +45 -0
- package/src/duckdb/src/function/table/system/duckdb_settings.cpp +11 -1
- package/src/duckdb/src/function/table/system_functions.cpp +1 -0
- package/src/duckdb/src/function/table/version/pragma_version.cpp +3 -3
- package/src/duckdb/src/include/duckdb/common/enum_util.hpp +8 -0
- package/src/duckdb/src/include/duckdb/common/string_util.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/virtual_file_system.hpp +4 -1
- package/src/duckdb/src/include/duckdb/function/scalar/variant_functions.hpp +1 -1
- package/src/duckdb/src/include/duckdb/function/table/system_functions.hpp +4 -0
- package/src/duckdb/src/include/duckdb/logging/log_storage.hpp +6 -6
- package/src/duckdb/src/include/duckdb/logging/log_type.hpp +26 -3
- package/src/duckdb/src/include/duckdb/main/attached_database.hpp +4 -0
- package/src/duckdb/src/include/duckdb/main/client_context.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/connection.hpp +0 -1
- package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +0 -1
- package/src/duckdb/src/include/duckdb/main/database_file_path_manager.hpp +12 -1
- package/src/duckdb/src/include/duckdb/main/database_manager.hpp +3 -0
- package/src/duckdb/src/include/duckdb/main/relation/create_table_relation.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/relation/create_view_relation.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/relation/delete_relation.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/relation/insert_relation.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/relation/query_relation.hpp +1 -0
- package/src/duckdb/src/include/duckdb/main/relation/update_relation.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/relation/write_csv_relation.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/relation/write_parquet_relation.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
- package/src/duckdb/src/include/duckdb/main/secret/secret.hpp +3 -1
- package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +3 -2
- package/src/duckdb/src/include/duckdb/planner/binder.hpp +62 -3
- package/src/duckdb/src/include/duckdb/planner/expression_binder/lateral_binder.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/operator/logical_cte.hpp +1 -1
- package/src/duckdb/src/include/duckdb/planner/operator/logical_dependent_join.hpp +3 -3
- package/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/subquery/has_correlated_expressions.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/subquery/rewrite_cte_scan.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/tableref/bound_joinref.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_analyze.hpp +6 -1
- package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_analyze.hpp +5 -1
- package/src/duckdb/src/include/duckdb/storage/metadata/metadata_manager.hpp +9 -7
- package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +2 -0
- package/src/duckdb/src/include/duckdb/storage/table/array_column_data.hpp +4 -4
- package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +6 -6
- package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +4 -4
- package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +4 -4
- package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +5 -3
- package/src/duckdb/src/include/duckdb/storage/table/row_id_column_data.hpp +4 -4
- package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +4 -4
- package/src/duckdb/src/include/duckdb/storage/table/struct_column_data.hpp +4 -4
- package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +2 -2
- package/src/duckdb/src/include/duckdb/transaction/duck_transaction.hpp +2 -1
- package/src/duckdb/src/include/duckdb/transaction/update_info.hpp +4 -1
- package/src/duckdb/src/include/duckdb/transaction/wal_write_state.hpp +1 -1
- package/src/duckdb/src/logging/log_types.cpp +63 -0
- package/src/duckdb/src/main/attached_database.cpp +16 -3
- package/src/duckdb/src/main/client_context.cpp +27 -19
- package/src/duckdb/src/main/connection.cpp +2 -5
- package/src/duckdb/src/main/database_file_path_manager.cpp +23 -6
- package/src/duckdb/src/main/database_manager.cpp +18 -3
- package/src/duckdb/src/main/http/http_util.cpp +3 -1
- package/src/duckdb/src/main/relation/create_table_relation.cpp +8 -0
- package/src/duckdb/src/main/relation/create_view_relation.cpp +8 -0
- package/src/duckdb/src/main/relation/delete_relation.cpp +8 -0
- package/src/duckdb/src/main/relation/explain_relation.cpp +8 -0
- package/src/duckdb/src/main/relation/insert_relation.cpp +8 -0
- package/src/duckdb/src/main/relation/query_relation.cpp +4 -0
- package/src/duckdb/src/main/relation/update_relation.cpp +8 -0
- package/src/duckdb/src/main/relation/write_csv_relation.cpp +8 -0
- package/src/duckdb/src/main/relation/write_parquet_relation.cpp +8 -0
- package/src/duckdb/src/main/relation.cpp +2 -2
- package/src/duckdb/src/optimizer/filter_combiner.cpp +7 -0
- package/src/duckdb/src/optimizer/filter_pushdown.cpp +9 -3
- package/src/duckdb/src/optimizer/pushdown/pushdown_get.cpp +4 -1
- package/src/duckdb/src/optimizer/rule/comparison_simplification.cpp +3 -7
- package/src/duckdb/src/parser/statement/relation_statement.cpp +1 -4
- package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +2 -0
- package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +8 -6
- package/src/duckdb/src/planner/binder/statement/bind_create.cpp +1 -5
- package/src/duckdb/src/planner/binder/statement/bind_merge_into.cpp +10 -2
- package/src/duckdb/src/planner/binder/statement/bind_pragma.cpp +20 -3
- package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +8 -3
- package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +9 -2
- package/src/duckdb/src/planner/binder.cpp +2 -2
- package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +9 -13
- package/src/duckdb/src/planner/expression_binder/table_function_binder.cpp +4 -0
- package/src/duckdb/src/planner/expression_binder.cpp +3 -1
- package/src/duckdb/src/planner/operator/logical_dependent_join.cpp +2 -2
- package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +12 -14
- package/src/duckdb/src/planner/subquery/has_correlated_expressions.cpp +1 -1
- package/src/duckdb/src/planner/subquery/rewrite_cte_scan.cpp +2 -2
- package/src/duckdb/src/storage/compression/bitpacking.cpp +1 -2
- package/src/duckdb/src/storage/data_table.cpp +2 -2
- package/src/duckdb/src/storage/local_storage.cpp +1 -1
- package/src/duckdb/src/storage/metadata/metadata_manager.cpp +67 -25
- package/src/duckdb/src/storage/statistics/string_stats.cpp +8 -0
- package/src/duckdb/src/storage/table/array_column_data.cpp +6 -5
- package/src/duckdb/src/storage/table/column_data.cpp +23 -9
- package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +15 -1
- package/src/duckdb/src/storage/table/list_column_data.cpp +5 -4
- package/src/duckdb/src/storage/table/row_group.cpp +8 -8
- package/src/duckdb/src/storage/table/row_group_collection.cpp +12 -8
- package/src/duckdb/src/storage/table/row_id_column_data.cpp +5 -4
- package/src/duckdb/src/storage/table/standard_column_data.cpp +9 -8
- package/src/duckdb/src/storage/table/struct_column_data.cpp +10 -9
- package/src/duckdb/src/storage/table/update_segment.cpp +12 -10
- package/src/duckdb/src/transaction/commit_state.cpp +18 -0
- package/src/duckdb/src/transaction/duck_transaction.cpp +2 -10
- package/src/duckdb/src/transaction/wal_write_state.cpp +5 -5
- package/src/duckdb/third_party/httplib/httplib.hpp +6 -1
- package/src/duckdb/ub_src_function_table_system.cpp +2 -0
@@ -7,6 +7,7 @@
|
|
7
7
|
#include "duckdb/transaction/duck_transaction.hpp"
|
8
8
|
#include "duckdb/transaction/update_info.hpp"
|
9
9
|
#include "duckdb/transaction/undo_buffer.hpp"
|
10
|
+
#include "duckdb/storage/data_table.hpp"
|
10
11
|
|
11
12
|
#include <algorithm>
|
12
13
|
|
@@ -104,9 +105,10 @@ idx_t UpdateInfo::GetAllocSize(idx_t type_size) {
|
|
104
105
|
return AlignValue<idx_t>(sizeof(UpdateInfo) + (sizeof(sel_t) + type_size) * STANDARD_VECTOR_SIZE);
|
105
106
|
}
|
106
107
|
|
107
|
-
void UpdateInfo::Initialize(UpdateInfo &info, transaction_t transaction_id) {
|
108
|
+
void UpdateInfo::Initialize(UpdateInfo &info, DataTable &data_table, transaction_t transaction_id) {
|
108
109
|
info.max = STANDARD_VECTOR_SIZE;
|
109
110
|
info.version_number = transaction_id;
|
111
|
+
info.table = &data_table;
|
110
112
|
info.segment = nullptr;
|
111
113
|
info.prev.entry = nullptr;
|
112
114
|
info.next.entry = nullptr;
|
@@ -1236,11 +1238,11 @@ static idx_t SortSelectionVector(SelectionVector &sel, idx_t count, row_t *ids)
|
|
1236
1238
|
return pos;
|
1237
1239
|
}
|
1238
1240
|
|
1239
|
-
UpdateInfo *CreateEmptyUpdateInfo(TransactionData transaction, idx_t type_size, idx_t count,
|
1241
|
+
UpdateInfo *CreateEmptyUpdateInfo(TransactionData transaction, DataTable &data_table, idx_t type_size, idx_t count,
|
1240
1242
|
unsafe_unique_array<char> &data) {
|
1241
1243
|
data = make_unsafe_uniq_array_uninitialized<char>(UpdateInfo::GetAllocSize(type_size));
|
1242
1244
|
auto update_info = reinterpret_cast<UpdateInfo *>(data.get());
|
1243
|
-
UpdateInfo::Initialize(*update_info, transaction.transaction_id);
|
1245
|
+
UpdateInfo::Initialize(*update_info, data_table, transaction.transaction_id);
|
1244
1246
|
return update_info;
|
1245
1247
|
}
|
1246
1248
|
|
@@ -1258,8 +1260,8 @@ void UpdateSegment::InitializeUpdateInfo(idx_t vector_idx) {
|
|
1258
1260
|
}
|
1259
1261
|
}
|
1260
1262
|
|
1261
|
-
void UpdateSegment::Update(TransactionData transaction, idx_t column_index, Vector &update_p,
|
1262
|
-
Vector &base_data) {
|
1263
|
+
void UpdateSegment::Update(TransactionData transaction, DataTable &data_table, idx_t column_index, Vector &update_p,
|
1264
|
+
row_t *ids, idx_t count, Vector &base_data) {
|
1263
1265
|
// obtain an exclusive lock
|
1264
1266
|
auto write_lock = lock.GetExclusiveLock();
|
1265
1267
|
|
@@ -1322,10 +1324,10 @@ void UpdateSegment::Update(TransactionData transaction, idx_t column_index, Vect
|
|
1322
1324
|
// no updates made yet by this transaction: initially the update info to empty
|
1323
1325
|
if (transaction.transaction) {
|
1324
1326
|
auto &dtransaction = transaction.transaction->Cast<DuckTransaction>();
|
1325
|
-
node_ref = dtransaction.CreateUpdateInfo(type_size, count);
|
1327
|
+
node_ref = dtransaction.CreateUpdateInfo(type_size, data_table, count);
|
1326
1328
|
node = &UpdateInfo::Get(node_ref);
|
1327
1329
|
} else {
|
1328
|
-
node = CreateEmptyUpdateInfo(transaction, type_size, count, update_info_data);
|
1330
|
+
node = CreateEmptyUpdateInfo(transaction, data_table, type_size, count, update_info_data);
|
1329
1331
|
}
|
1330
1332
|
node->segment = this;
|
1331
1333
|
node->vector_index = vector_index;
|
@@ -1360,7 +1362,7 @@ void UpdateSegment::Update(TransactionData transaction, idx_t column_index, Vect
|
|
1360
1362
|
idx_t alloc_size = UpdateInfo::GetAllocSize(type_size);
|
1361
1363
|
auto handle = root->allocator.Allocate(alloc_size);
|
1362
1364
|
auto &update_info = UpdateInfo::Get(handle);
|
1363
|
-
UpdateInfo::Initialize(update_info, TRANSACTION_ID_START - 1);
|
1365
|
+
UpdateInfo::Initialize(update_info, data_table, TRANSACTION_ID_START - 1);
|
1364
1366
|
update_info.column_index = column_index;
|
1365
1367
|
|
1366
1368
|
InitializeUpdateInfo(update_info, ids, sel, count, vector_index, vector_offset);
|
@@ -1370,10 +1372,10 @@ void UpdateSegment::Update(TransactionData transaction, idx_t column_index, Vect
|
|
1370
1372
|
UndoBufferReference node_ref;
|
1371
1373
|
optional_ptr<UpdateInfo> transaction_node;
|
1372
1374
|
if (transaction.transaction) {
|
1373
|
-
node_ref = transaction.transaction->CreateUpdateInfo(type_size, count);
|
1375
|
+
node_ref = transaction.transaction->CreateUpdateInfo(type_size, data_table, count);
|
1374
1376
|
transaction_node = &UpdateInfo::Get(node_ref);
|
1375
1377
|
} else {
|
1376
|
-
transaction_node = CreateEmptyUpdateInfo(transaction, type_size, count, update_info_data);
|
1378
|
+
transaction_node = CreateEmptyUpdateInfo(transaction, data_table, type_size, count, update_info_data);
|
1377
1379
|
}
|
1378
1380
|
|
1379
1381
|
InitializeUpdateInfo(*transaction_node, ids, sel, count, vector_index, vector_offset);
|
@@ -165,6 +165,12 @@ void CommitState::CommitEntry(UndoFlags type, data_ptr_t data) {
|
|
165
165
|
case UndoFlags::INSERT_TUPLE: {
|
166
166
|
// append:
|
167
167
|
auto info = reinterpret_cast<AppendInfo *>(data);
|
168
|
+
if (!info->table->IsMainTable()) {
|
169
|
+
auto table_name = info->table->GetTableName();
|
170
|
+
auto table_modification = info->table->TableModification();
|
171
|
+
throw TransactionException("Attempting to modify table %s but another transaction has %s this table",
|
172
|
+
table_name, table_modification);
|
173
|
+
}
|
168
174
|
// mark the tuples as committed
|
169
175
|
info->table->CommitAppend(commit_id, info->start_row, info->count);
|
170
176
|
break;
|
@@ -172,6 +178,12 @@ void CommitState::CommitEntry(UndoFlags type, data_ptr_t data) {
|
|
172
178
|
case UndoFlags::DELETE_TUPLE: {
|
173
179
|
// deletion:
|
174
180
|
auto info = reinterpret_cast<DeleteInfo *>(data);
|
181
|
+
if (!info->table->IsMainTable()) {
|
182
|
+
auto table_name = info->table->GetTableName();
|
183
|
+
auto table_modification = info->table->TableModification();
|
184
|
+
throw TransactionException("Attempting to modify table %s but another transaction has %s this table",
|
185
|
+
table_name, table_modification);
|
186
|
+
}
|
175
187
|
// mark the tuples as committed
|
176
188
|
info->version_info->CommitDelete(info->vector_idx, commit_id, *info);
|
177
189
|
break;
|
@@ -179,6 +191,12 @@ void CommitState::CommitEntry(UndoFlags type, data_ptr_t data) {
|
|
179
191
|
case UndoFlags::UPDATE_TUPLE: {
|
180
192
|
// update:
|
181
193
|
auto info = reinterpret_cast<UpdateInfo *>(data);
|
194
|
+
if (!info->table->IsMainTable()) {
|
195
|
+
auto table_name = info->table->GetTableName();
|
196
|
+
auto table_modification = info->table->TableModification();
|
197
|
+
throw TransactionException("Attempting to modify table %s but another transaction has %s this table",
|
198
|
+
table_name, table_modification);
|
199
|
+
}
|
182
200
|
info->version_number = commit_id;
|
183
201
|
break;
|
184
202
|
}
|
@@ -126,11 +126,11 @@ void DuckTransaction::PushAppend(DataTable &table, idx_t start_row, idx_t row_co
|
|
126
126
|
append_info->count = row_count;
|
127
127
|
}
|
128
128
|
|
129
|
-
UndoBufferReference DuckTransaction::CreateUpdateInfo(idx_t type_size, idx_t entries) {
|
129
|
+
UndoBufferReference DuckTransaction::CreateUpdateInfo(idx_t type_size, DataTable &data_table, idx_t entries) {
|
130
130
|
idx_t alloc_size = UpdateInfo::GetAllocSize(type_size);
|
131
131
|
auto undo_entry = undo_buffer.CreateEntry(UndoFlags::UPDATE_TUPLE, alloc_size);
|
132
132
|
auto &update_info = UpdateInfo::Get(undo_entry);
|
133
|
-
UpdateInfo::Initialize(update_info, transaction_id);
|
133
|
+
UpdateInfo::Initialize(update_info, data_table, transaction_id);
|
134
134
|
return undo_entry;
|
135
135
|
}
|
136
136
|
|
@@ -246,14 +246,6 @@ ErrorData DuckTransaction::Commit(AttachedDatabase &db, transaction_t new_commit
|
|
246
246
|
// no need to flush anything if we made no changes
|
247
247
|
return ErrorData();
|
248
248
|
}
|
249
|
-
for (auto &entry : modified_tables) {
|
250
|
-
auto &tbl = entry.first.get();
|
251
|
-
if (!tbl.IsMainTable()) {
|
252
|
-
return ErrorData(
|
253
|
-
TransactionException("Attempting to modify table %s but another transaction has %s this table",
|
254
|
-
tbl.GetTableName(), tbl.TableModification()));
|
255
|
-
}
|
256
|
-
}
|
257
249
|
D_ASSERT(db.IsSystem() || db.IsTemporary() || !IsReadOnly());
|
258
250
|
|
259
251
|
UndoBuffer::IteratorState iterator_state;
|
@@ -27,10 +27,10 @@ WALWriteState::WALWriteState(DuckTransaction &transaction_p, WriteAheadLog &log,
|
|
27
27
|
: transaction(transaction_p), log(log), commit_state(commit_state), current_table_info(nullptr) {
|
28
28
|
}
|
29
29
|
|
30
|
-
void WALWriteState::SwitchTable(DataTableInfo
|
31
|
-
if (current_table_info != table_info) {
|
30
|
+
void WALWriteState::SwitchTable(DataTableInfo &table_info, UndoFlags new_op) {
|
31
|
+
if (current_table_info != &table_info) {
|
32
32
|
// write the current table to the log
|
33
|
-
log.WriteSetTable(table_info
|
33
|
+
log.WriteSetTable(table_info.GetSchemaName(), table_info.GetTableName());
|
34
34
|
current_table_info = table_info;
|
35
35
|
}
|
36
36
|
}
|
@@ -171,7 +171,7 @@ void WALWriteState::WriteCatalogEntry(CatalogEntry &entry, data_ptr_t dataptr) {
|
|
171
171
|
|
172
172
|
void WALWriteState::WriteDelete(DeleteInfo &info) {
|
173
173
|
// switch to the current table, if necessary
|
174
|
-
SwitchTable(info.table->GetDataTableInfo()
|
174
|
+
SwitchTable(*info.table->GetDataTableInfo(), UndoFlags::DELETE_TUPLE);
|
175
175
|
|
176
176
|
if (!delete_chunk) {
|
177
177
|
delete_chunk = make_uniq<DataChunk>();
|
@@ -198,7 +198,7 @@ void WALWriteState::WriteUpdate(UpdateInfo &info) {
|
|
198
198
|
auto &column_data = info.segment->column_data;
|
199
199
|
auto &table_info = column_data.GetTableInfo();
|
200
200
|
|
201
|
-
SwitchTable(
|
201
|
+
SwitchTable(table_info, UndoFlags::UPDATE_TUPLE);
|
202
202
|
|
203
203
|
// initialize the update chunk
|
204
204
|
vector<LogicalType> update_types;
|
@@ -7077,7 +7077,12 @@ inline bool ClientImpl::redirect(Request &req, Response &res, Error &error) {
|
|
7077
7077
|
}
|
7078
7078
|
|
7079
7079
|
auto location = res.get_header_value("location");
|
7080
|
-
if (location.empty()) {
|
7080
|
+
if (location.empty()) {
|
7081
|
+
// s3 requests will not return a location header, and instead a
|
7082
|
+
// X-Amx-Region-Bucket header. Return true so all response headers
|
7083
|
+
// are returned to the httpfs/calling extension
|
7084
|
+
return true;
|
7085
|
+
}
|
7081
7086
|
|
7082
7087
|
const Regex re(
|
7083
7088
|
R"((?:(https?):)?(?://(?:\[([\d:]+)\]|([^:/?#]+))(?::(\d+))?)?([^?#]*)(\?[^#]*)?(?:#.*)?)");
|