duckdb 0.8.2-dev2090.0 → 0.8.2-dev2133.0

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.
Files changed (63) hide show
  1. package/binding.gyp +3 -0
  2. package/package.json +1 -1
  3. package/src/duckdb/extension/json/buffered_json_reader.cpp +2 -0
  4. package/src/duckdb/extension/json/include/buffered_json_reader.hpp +5 -19
  5. package/src/duckdb/extension/json/include/json_enums.hpp +60 -0
  6. package/src/duckdb/extension/json/include/json_scan.hpp +14 -10
  7. package/src/duckdb/extension/json/include/json_transform.hpp +3 -0
  8. package/src/duckdb/extension/json/json_enums.cpp +105 -0
  9. package/src/duckdb/extension/json/json_functions/json_transform.cpp +2 -0
  10. package/src/duckdb/extension/json/json_scan.cpp +44 -0
  11. package/src/duckdb/extension/json/serialize_json.cpp +92 -0
  12. package/src/duckdb/extension/parquet/include/parquet_reader.hpp +3 -0
  13. package/src/duckdb/extension/parquet/parquet_extension.cpp +23 -0
  14. package/src/duckdb/extension/parquet/parquet_reader.cpp +3 -0
  15. package/src/duckdb/extension/parquet/serialize_parquet.cpp +26 -0
  16. package/src/duckdb/src/common/local_file_system.cpp +17 -14
  17. package/src/duckdb/src/common/serializer/format_serializer.cpp +15 -0
  18. package/src/duckdb/src/core_functions/aggregate/holistic/approximate_quantile.cpp +26 -0
  19. package/src/duckdb/src/core_functions/aggregate/holistic/quantile.cpp +47 -0
  20. package/src/duckdb/src/core_functions/aggregate/holistic/reservoir_quantile.cpp +28 -0
  21. package/src/duckdb/src/core_functions/scalar/date/strftime.cpp +10 -0
  22. package/src/duckdb/src/core_functions/scalar/list/list_lambdas.cpp +22 -3
  23. package/src/duckdb/src/function/aggregate/distributive/count.cpp +0 -11
  24. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +1 -9
  25. package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +27 -0
  26. package/src/duckdb/src/function/scalar_function.cpp +2 -1
  27. package/src/duckdb/src/function/table/read_csv.cpp +18 -0
  28. package/src/duckdb/src/function/table/table_scan.cpp +35 -0
  29. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  30. package/src/duckdb/src/function/table_function.cpp +4 -3
  31. package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +5 -1
  32. package/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp +2 -0
  33. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +32 -0
  34. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +45 -15
  35. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +10 -0
  36. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +2 -0
  37. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +11 -2
  38. package/src/duckdb/src/include/duckdb/function/function_serialization.hpp +81 -0
  39. package/src/duckdb/src/include/duckdb/function/scalar/strftime_format.hpp +8 -0
  40. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +8 -0
  41. package/src/duckdb/src/include/duckdb/function/table/read_csv.hpp +7 -0
  42. package/src/duckdb/src/include/duckdb/function/table_function.hpp +8 -0
  43. package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
  44. package/src/duckdb/src/include/duckdb/planner/expression/bound_function_expression.hpp +4 -0
  45. package/src/duckdb/src/include/duckdb/planner/expression/bound_window_expression.hpp +3 -0
  46. package/src/duckdb/src/include/duckdb/planner/filter/conjunction_filter.hpp +4 -0
  47. package/src/duckdb/src/include/duckdb/planner/filter/constant_filter.hpp +2 -0
  48. package/src/duckdb/src/include/duckdb/planner/filter/null_filter.hpp +4 -0
  49. package/src/duckdb/src/include/duckdb/planner/operator/logical_copy_to_file.hpp +2 -0
  50. package/src/duckdb/src/include/duckdb/planner/operator/logical_get.hpp +7 -1
  51. package/src/duckdb/src/include/duckdb/planner/table_filter.hpp +7 -1
  52. package/src/duckdb/src/main/extension/extension_helper.cpp +13 -0
  53. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +23 -0
  54. package/src/duckdb/src/planner/expression/bound_function_expression.cpp +22 -0
  55. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +47 -0
  56. package/src/duckdb/src/planner/operator/logical_copy_to_file.cpp +8 -0
  57. package/src/duckdb/src/planner/operator/logical_get.cpp +69 -0
  58. package/src/duckdb/src/storage/serialization/serialize_expression.cpp +9 -0
  59. package/src/duckdb/src/storage/serialization/serialize_logical_operator.cpp +6 -0
  60. package/src/duckdb/src/storage/serialization/serialize_nodes.cpp +190 -0
  61. package/src/duckdb/src/storage/serialization/serialize_table_filter.cpp +97 -0
  62. package/src/duckdb/ub_src_common_serializer.cpp +2 -0
  63. package/src/duckdb/ub_src_storage_serialization.cpp +2 -0
@@ -4,6 +4,8 @@
4
4
  #include "duckdb/planner/expression.hpp"
5
5
  #include "duckdb/common/operator/cast_operators.hpp"
6
6
  #include "duckdb/common/field_writer.hpp"
7
+ #include "duckdb/common/serializer/format_serializer.hpp"
8
+ #include "duckdb/common/serializer/format_deserializer.hpp"
7
9
 
8
10
  #include <algorithm>
9
11
  #include <cmath>
@@ -17,6 +19,8 @@ struct ApproxQuantileState {
17
19
  };
18
20
 
19
21
  struct ApproximateQuantileBindData : public FunctionData {
22
+ ApproximateQuantileBindData() {
23
+ }
20
24
  explicit ApproximateQuantileBindData(float quantile_p) : quantiles(1, quantile_p) {
21
25
  }
22
26
 
@@ -48,6 +52,18 @@ struct ApproximateQuantileBindData : public FunctionData {
48
52
  return make_uniq<ApproximateQuantileBindData>(std::move(quantiles));
49
53
  }
50
54
 
55
+ static void FormatSerialize(FormatSerializer &serializer, const optional_ptr<FunctionData> bind_data_p,
56
+ const AggregateFunction &function) {
57
+ auto &bind_data = bind_data_p->Cast<ApproximateQuantileBindData>();
58
+ serializer.WriteProperty("quantiles", bind_data.quantiles);
59
+ }
60
+
61
+ static unique_ptr<FunctionData> FormatDeserialize(FormatDeserializer &deserializer, AggregateFunction &function) {
62
+ auto result = make_uniq<ApproximateQuantileBindData>();
63
+ deserializer.ReadProperty("quantiles", result->quantiles);
64
+ return std::move(result);
65
+ }
66
+
51
67
  vector<float> quantiles;
52
68
  };
53
69
 
@@ -192,6 +208,8 @@ unique_ptr<FunctionData> BindApproxQuantileDecimal(ClientContext &context, Aggre
192
208
  function.name = "approx_quantile";
193
209
  function.serialize = ApproximateQuantileBindData::Serialize;
194
210
  function.deserialize = ApproximateQuantileBindData::Deserialize;
211
+ function.format_serialize = ApproximateQuantileBindData::FormatSerialize;
212
+ function.format_deserialize = ApproximateQuantileBindData::FormatDeserialize;
195
213
  return bind_data;
196
214
  }
197
215
 
@@ -200,6 +218,8 @@ AggregateFunction GetApproximateQuantileAggregate(PhysicalType type) {
200
218
  fun.bind = BindApproxQuantile;
201
219
  fun.serialize = ApproximateQuantileBindData::Serialize;
202
220
  fun.deserialize = ApproximateQuantileBindData::Deserialize;
221
+ fun.format_serialize = ApproximateQuantileBindData::FormatSerialize;
222
+ fun.format_deserialize = ApproximateQuantileBindData::FormatDeserialize;
203
223
  // temporarily push an argument so we can bind the actual quantile
204
224
  fun.arguments.emplace_back(LogicalType::FLOAT);
205
225
  return fun;
@@ -255,6 +275,8 @@ AggregateFunction GetTypedApproxQuantileListAggregateFunction(const LogicalType
255
275
  auto fun = ApproxQuantileListAggregate<STATE, INPUT_TYPE, list_entry_t, OP>(type, type);
256
276
  fun.serialize = ApproximateQuantileBindData::Serialize;
257
277
  fun.deserialize = ApproximateQuantileBindData::Deserialize;
278
+ fun.format_serialize = ApproximateQuantileBindData::FormatSerialize;
279
+ fun.format_deserialize = ApproximateQuantileBindData::FormatDeserialize;
258
280
  return fun;
259
281
  }
260
282
 
@@ -300,6 +322,8 @@ unique_ptr<FunctionData> BindApproxQuantileDecimalList(ClientContext &context, A
300
322
  function.name = "approx_quantile";
301
323
  function.serialize = ApproximateQuantileBindData::Serialize;
302
324
  function.deserialize = ApproximateQuantileBindData::Deserialize;
325
+ function.format_serialize = ApproximateQuantileBindData::FormatSerialize;
326
+ function.format_deserialize = ApproximateQuantileBindData::FormatDeserialize;
303
327
  return bind_data;
304
328
  }
305
329
 
@@ -308,6 +332,8 @@ AggregateFunction GetApproxQuantileListAggregate(const LogicalType &type) {
308
332
  fun.bind = BindApproxQuantile;
309
333
  fun.serialize = ApproximateQuantileBindData::Serialize;
310
334
  fun.deserialize = ApproximateQuantileBindData::Deserialize;
335
+ fun.format_serialize = ApproximateQuantileBindData::FormatSerialize;
336
+ fun.format_deserialize = ApproximateQuantileBindData::FormatDeserialize;
311
337
  // temporarily push an argument so we can bind the actual quantile
312
338
  auto list_of_float = LogicalType::LIST(LogicalType::FLOAT);
313
339
  fun.arguments.push_back(list_of_float);
@@ -8,6 +8,8 @@
8
8
  #include "duckdb/common/types/timestamp.hpp"
9
9
  #include "duckdb/common/queue.hpp"
10
10
  #include "duckdb/common/field_writer.hpp"
11
+ #include "duckdb/common/serializer/format_serializer.hpp"
12
+ #include "duckdb/common/serializer/format_deserializer.hpp"
11
13
 
12
14
  #include <algorithm>
13
15
  #include <stdlib.h>
@@ -417,6 +419,8 @@ inline Value QuantileAbs(const Value &v) {
417
419
  }
418
420
 
419
421
  struct QuantileBindData : public FunctionData {
422
+ QuantileBindData() {
423
+ }
420
424
 
421
425
  explicit QuantileBindData(const Value &quantile_p)
422
426
  : quantiles(1, QuantileAbs(quantile_p)), order(1, 0), desc(quantile_p < 0) {
@@ -456,6 +460,27 @@ struct QuantileBindData : public FunctionData {
456
460
  return desc == other.desc && quantiles == other.quantiles && order == other.order;
457
461
  }
458
462
 
463
+ static void FormatSerialize(FormatSerializer &serializer, const optional_ptr<FunctionData> bind_data_p,
464
+ const AggregateFunction &function) {
465
+ auto &bind_data = bind_data_p->Cast<QuantileBindData>();
466
+ serializer.WriteProperty("quantiles", bind_data.quantiles);
467
+ serializer.WriteProperty("order", bind_data.order);
468
+ serializer.WriteProperty("desc", bind_data.desc);
469
+ }
470
+
471
+ static unique_ptr<FunctionData> FormatDeserialize(FormatDeserializer &deserializer, AggregateFunction &function) {
472
+ auto result = make_uniq<QuantileBindData>();
473
+ deserializer.ReadProperty("quantiles", result->quantiles);
474
+ deserializer.ReadProperty("order", result->order);
475
+ deserializer.ReadProperty("desc", result->desc);
476
+ return std::move(result);
477
+ }
478
+
479
+ static void FormatSerializeDecimal(FormatSerializer &serializer, const optional_ptr<FunctionData> bind_data_p,
480
+ const AggregateFunction &function) {
481
+ throw SerializationException("FIXME: quantile serialize for decimal");
482
+ }
483
+
459
484
  vector<Value> quantiles;
460
485
  vector<idx_t> order;
461
486
  bool desc;
@@ -1189,6 +1214,8 @@ unique_ptr<FunctionData> BindMedianDecimal(ClientContext &context, AggregateFunc
1189
1214
  function.name = "median";
1190
1215
  function.serialize = QuantileDecimalSerialize;
1191
1216
  function.deserialize = QuantileDeserialize;
1217
+ function.format_serialize = QuantileBindData::FormatSerializeDecimal;
1218
+ function.format_deserialize = QuantileBindData::FormatDeserialize;
1192
1219
  function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1193
1220
  return bind_data;
1194
1221
  }
@@ -1245,6 +1272,8 @@ unique_ptr<FunctionData> BindDiscreteQuantileDecimal(ClientContext &context, Agg
1245
1272
  function.name = "quantile_disc";
1246
1273
  function.serialize = QuantileDecimalSerialize;
1247
1274
  function.deserialize = QuantileDeserialize;
1275
+ function.format_serialize = QuantileBindData::FormatSerializeDecimal;
1276
+ function.format_deserialize = QuantileBindData::FormatDeserialize;
1248
1277
  function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1249
1278
  return bind_data;
1250
1279
  }
@@ -1256,6 +1285,8 @@ unique_ptr<FunctionData> BindDiscreteQuantileDecimalList(ClientContext &context,
1256
1285
  function.name = "quantile_disc";
1257
1286
  function.serialize = QuantileDecimalSerialize;
1258
1287
  function.deserialize = QuantileDeserialize;
1288
+ function.format_serialize = QuantileBindData::FormatSerializeDecimal;
1289
+ function.format_deserialize = QuantileBindData::FormatDeserialize;
1259
1290
  function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1260
1291
  return bind_data;
1261
1292
  }
@@ -1267,6 +1298,8 @@ unique_ptr<FunctionData> BindContinuousQuantileDecimal(ClientContext &context, A
1267
1298
  function.name = "quantile_cont";
1268
1299
  function.serialize = QuantileDecimalSerialize;
1269
1300
  function.deserialize = QuantileDeserialize;
1301
+ function.format_serialize = QuantileBindData::FormatSerializeDecimal;
1302
+ function.format_deserialize = QuantileBindData::FormatDeserialize;
1270
1303
  function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1271
1304
  return bind_data;
1272
1305
  }
@@ -1278,6 +1311,8 @@ unique_ptr<FunctionData> BindContinuousQuantileDecimalList(ClientContext &contex
1278
1311
  function.name = "quantile_cont";
1279
1312
  function.serialize = QuantileDecimalSerialize;
1280
1313
  function.deserialize = QuantileDeserialize;
1314
+ function.format_serialize = QuantileBindData::FormatSerializeDecimal;
1315
+ function.format_deserialize = QuantileBindData::FormatDeserialize;
1281
1316
  function.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1282
1317
  return bind_data;
1283
1318
  }
@@ -1298,6 +1333,8 @@ AggregateFunction GetMedianAggregate(const LogicalType &type) {
1298
1333
  fun.bind = BindMedian;
1299
1334
  fun.serialize = QuantileSerialize;
1300
1335
  fun.deserialize = QuantileDeserialize;
1336
+ fun.format_serialize = QuantileBindData::FormatSerialize;
1337
+ fun.format_deserialize = QuantileBindData::FormatDeserialize;
1301
1338
  return fun;
1302
1339
  }
1303
1340
 
@@ -1306,6 +1343,8 @@ AggregateFunction GetDiscreteQuantileAggregate(const LogicalType &type) {
1306
1343
  fun.bind = BindQuantile;
1307
1344
  fun.serialize = QuantileSerialize;
1308
1345
  fun.deserialize = QuantileDeserialize;
1346
+ fun.format_serialize = QuantileBindData::FormatSerialize;
1347
+ fun.format_deserialize = QuantileBindData::FormatDeserialize;
1309
1348
  // temporarily push an argument so we can bind the actual quantile
1310
1349
  fun.arguments.emplace_back(LogicalType::DOUBLE);
1311
1350
  fun.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
@@ -1317,6 +1356,8 @@ AggregateFunction GetDiscreteQuantileListAggregate(const LogicalType &type) {
1317
1356
  fun.bind = BindQuantile;
1318
1357
  fun.serialize = QuantileSerialize;
1319
1358
  fun.deserialize = QuantileDeserialize;
1359
+ fun.format_serialize = QuantileBindData::FormatSerialize;
1360
+ fun.format_deserialize = QuantileBindData::FormatDeserialize;
1320
1361
  // temporarily push an argument so we can bind the actual quantile
1321
1362
  auto list_of_double = LogicalType::LIST(LogicalType::DOUBLE);
1322
1363
  fun.arguments.push_back(list_of_double);
@@ -1329,6 +1370,8 @@ AggregateFunction GetContinuousQuantileAggregate(const LogicalType &type) {
1329
1370
  fun.bind = BindQuantile;
1330
1371
  fun.serialize = QuantileSerialize;
1331
1372
  fun.deserialize = QuantileDeserialize;
1373
+ fun.format_serialize = QuantileBindData::FormatSerialize;
1374
+ fun.format_deserialize = QuantileBindData::FormatDeserialize;
1332
1375
  // temporarily push an argument so we can bind the actual quantile
1333
1376
  fun.arguments.emplace_back(LogicalType::DOUBLE);
1334
1377
  fun.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
@@ -1340,6 +1383,8 @@ AggregateFunction GetContinuousQuantileListAggregate(const LogicalType &type) {
1340
1383
  fun.bind = BindQuantile;
1341
1384
  fun.serialize = QuantileSerialize;
1342
1385
  fun.deserialize = QuantileDeserialize;
1386
+ fun.format_serialize = QuantileBindData::FormatSerialize;
1387
+ fun.format_deserialize = QuantileBindData::FormatDeserialize;
1343
1388
  // temporarily push an argument so we can bind the actual quantile
1344
1389
  auto list_of_double = LogicalType::LIST(LogicalType::DOUBLE);
1345
1390
  fun.arguments.push_back(list_of_double);
@@ -1353,6 +1398,8 @@ AggregateFunction GetQuantileDecimalAggregate(const vector<LogicalType> &argumen
1353
1398
  fun.bind = bind;
1354
1399
  fun.serialize = QuantileSerialize;
1355
1400
  fun.deserialize = QuantileDeserialize;
1401
+ fun.format_serialize = QuantileBindData::FormatSerialize;
1402
+ fun.format_deserialize = QuantileBindData::FormatDeserialize;
1356
1403
  fun.order_dependent = AggregateOrderDependent::NOT_ORDER_DEPENDENT;
1357
1404
  return fun;
1358
1405
  }
@@ -4,6 +4,8 @@
4
4
  #include "duckdb/planner/expression.hpp"
5
5
  #include "duckdb/common/queue.hpp"
6
6
  #include "duckdb/common/field_writer.hpp"
7
+ #include "duckdb/common/serializer/format_serializer.hpp"
8
+ #include "duckdb/common/serializer/format_deserializer.hpp"
7
9
 
8
10
  #include <algorithm>
9
11
  #include <stdlib.h>
@@ -49,6 +51,8 @@ struct ReservoirQuantileState {
49
51
  };
50
52
 
51
53
  struct ReservoirQuantileBindData : public FunctionData {
54
+ ReservoirQuantileBindData() {
55
+ }
52
56
  ReservoirQuantileBindData(double quantile_p, int32_t sample_size_p)
53
57
  : quantiles(1, quantile_p), sample_size(sample_size_p) {
54
58
  }
@@ -80,6 +84,20 @@ struct ReservoirQuantileBindData : public FunctionData {
80
84
  return make_uniq<ReservoirQuantileBindData>(std::move(quantiles), sample_size);
81
85
  }
82
86
 
87
+ static void FormatSerialize(FormatSerializer &serializer, const optional_ptr<FunctionData> bind_data_p,
88
+ const AggregateFunction &function) {
89
+ auto &bind_data = bind_data_p->Cast<ReservoirQuantileBindData>();
90
+ serializer.WriteProperty("quantiles", bind_data.quantiles);
91
+ serializer.WriteProperty("sample_size", bind_data.sample_size);
92
+ }
93
+
94
+ static unique_ptr<FunctionData> FormatDeserialize(FormatDeserializer &deserializer, AggregateFunction &function) {
95
+ auto result = make_uniq<ReservoirQuantileBindData>();
96
+ deserializer.ReadProperty("quantiles", result->quantiles);
97
+ deserializer.ReadProperty("sample_size", result->sample_size);
98
+ return std::move(result);
99
+ }
100
+
83
101
  vector<double> quantiles;
84
102
  int32_t sample_size;
85
103
  };
@@ -355,6 +373,8 @@ unique_ptr<FunctionData> BindReservoirQuantileDecimal(ClientContext &context, Ag
355
373
  function.name = "reservoir_quantile";
356
374
  function.serialize = ReservoirQuantileBindData::Serialize;
357
375
  function.deserialize = ReservoirQuantileBindData::Deserialize;
376
+ function.format_serialize = ReservoirQuantileBindData::FormatSerialize;
377
+ function.format_deserialize = ReservoirQuantileBindData::FormatDeserialize;
358
378
  return bind_data;
359
379
  }
360
380
 
@@ -363,6 +383,8 @@ AggregateFunction GetReservoirQuantileAggregate(PhysicalType type) {
363
383
  fun.bind = BindReservoirQuantile;
364
384
  fun.serialize = ReservoirQuantileBindData::Serialize;
365
385
  fun.deserialize = ReservoirQuantileBindData::Deserialize;
386
+ fun.format_serialize = ReservoirQuantileBindData::FormatSerialize;
387
+ fun.format_deserialize = ReservoirQuantileBindData::FormatDeserialize;
366
388
  // temporarily push an argument so we can bind the actual quantile
367
389
  fun.arguments.emplace_back(LogicalType::DOUBLE);
368
390
  return fun;
@@ -374,6 +396,8 @@ unique_ptr<FunctionData> BindReservoirQuantileDecimalList(ClientContext &context
374
396
  auto bind_data = BindReservoirQuantile(context, function, arguments);
375
397
  function.serialize = ReservoirQuantileBindData::Serialize;
376
398
  function.deserialize = ReservoirQuantileBindData::Deserialize;
399
+ function.format_serialize = ReservoirQuantileBindData::FormatSerialize;
400
+ function.format_deserialize = ReservoirQuantileBindData::FormatDeserialize;
377
401
  function.name = "reservoir_quantile";
378
402
  return bind_data;
379
403
  }
@@ -383,6 +407,8 @@ AggregateFunction GetReservoirQuantileListAggregate(const LogicalType &type) {
383
407
  fun.bind = BindReservoirQuantile;
384
408
  fun.serialize = ReservoirQuantileBindData::Serialize;
385
409
  fun.deserialize = ReservoirQuantileBindData::Deserialize;
410
+ fun.format_serialize = ReservoirQuantileBindData::FormatSerialize;
411
+ fun.format_deserialize = ReservoirQuantileBindData::FormatDeserialize;
386
412
  // temporarily push an argument so we can bind the actual quantile
387
413
  auto list_of_double = LogicalType::LIST(LogicalType::DOUBLE);
388
414
  fun.arguments.push_back(list_of_double);
@@ -411,6 +437,8 @@ static void GetReservoirQuantileDecimalFunction(AggregateFunctionSet &set, const
411
437
  BindReservoirQuantileDecimal);
412
438
  fun.serialize = ReservoirQuantileBindData::Serialize;
413
439
  fun.deserialize = ReservoirQuantileBindData::Deserialize;
440
+ fun.format_serialize = ReservoirQuantileBindData::FormatSerialize;
441
+ fun.format_deserialize = ReservoirQuantileBindData::FormatDeserialize;
414
442
  set.AddFunction(fun);
415
443
 
416
444
  fun.arguments.emplace_back(LogicalType::INTEGER);
@@ -94,6 +94,16 @@ ScalarFunctionSet StrfTimeFun::GetFunctions() {
94
94
  return strftime;
95
95
  }
96
96
 
97
+ StrpTimeFormat::StrpTimeFormat() {
98
+ }
99
+
100
+ StrpTimeFormat::StrpTimeFormat(const string &format_string) {
101
+ if (format_string.empty()) {
102
+ return;
103
+ }
104
+ StrTimeFormat::ParseFormatSpecifier(format_string, *this);
105
+ }
106
+
97
107
  struct StrpTimeBindData : public FunctionData {
98
108
  StrpTimeBindData(const StrpTimeFormat &format, const string &format_string)
99
109
  : formats(1, format), format_strings(1, format_string) {
@@ -8,6 +8,8 @@
8
8
  #include "duckdb/planner/expression/bound_lambda_expression.hpp"
9
9
  #include "duckdb/planner/expression/bound_cast_expression.hpp"
10
10
  #include "duckdb/function/cast/cast_function_set.hpp"
11
+ #include "duckdb/common/serializer/format_serializer.hpp"
12
+ #include "duckdb/common/serializer/format_deserializer.hpp"
11
13
 
12
14
  namespace duckdb {
13
15
 
@@ -28,6 +30,19 @@ public:
28
30
  ScalarFunction &bound_function) {
29
31
  throw NotImplementedException("FIXME: list lambda deserialize");
30
32
  }
33
+
34
+ static void FormatSerialize(FormatSerializer &serializer, const optional_ptr<FunctionData> bind_data_p,
35
+ const ScalarFunction &function) {
36
+ auto &bind_data = bind_data_p->Cast<ListLambdaBindData>();
37
+ serializer.WriteProperty("stype", bind_data.stype);
38
+ serializer.WriteOptionalProperty("lambda_expr", bind_data.lambda_expr);
39
+ }
40
+
41
+ static unique_ptr<FunctionData> FormatDeserialize(FormatDeserializer &deserializer, ScalarFunction &function) {
42
+ auto stype = deserializer.ReadProperty<LogicalType>("stype");
43
+ auto lambda_expr = deserializer.ReadOptionalProperty<unique_ptr<Expression>>("lambda_expr");
44
+ return make_uniq<ListLambdaBindData>(stype, std::move(lambda_expr));
45
+ }
31
46
  };
32
47
 
33
48
  ListLambdaBindData::ListLambdaBindData(const LogicalType &stype_p, unique_ptr<Expression> lambda_expr_p)
@@ -35,12 +50,12 @@ ListLambdaBindData::ListLambdaBindData(const LogicalType &stype_p, unique_ptr<Ex
35
50
  }
36
51
 
37
52
  unique_ptr<FunctionData> ListLambdaBindData::Copy() const {
38
- return make_uniq<ListLambdaBindData>(stype, lambda_expr->Copy());
53
+ return make_uniq<ListLambdaBindData>(stype, lambda_expr ? lambda_expr->Copy() : nullptr);
39
54
  }
40
55
 
41
56
  bool ListLambdaBindData::Equals(const FunctionData &other_p) const {
42
57
  auto &other = other_p.Cast<ListLambdaBindData>();
43
- return lambda_expr->Equals(*other.lambda_expr) && stype == other.stype;
58
+ return Expression::Equals(lambda_expr, other.lambda_expr) && stype == other.stype;
44
59
  }
45
60
 
46
61
  ListLambdaBindData::~ListLambdaBindData() {
@@ -330,7 +345,7 @@ static unique_ptr<FunctionData> ListLambdaBind(ClientContext &context, ScalarFun
330
345
  if (arguments[0]->return_type.id() == LogicalTypeId::SQLNULL) {
331
346
  bound_function.arguments[0] = LogicalType::SQLNULL;
332
347
  bound_function.return_type = LogicalType::SQLNULL;
333
- return make_uniq<VariableReturnBindData>(bound_function.return_type);
348
+ return make_uniq<ListLambdaBindData>(bound_function.return_type, nullptr);
334
349
  }
335
350
 
336
351
  if (arguments[0]->return_type.id() == LogicalTypeId::UNKNOWN) {
@@ -385,6 +400,8 @@ ScalarFunction ListTransformFun::GetFunction() {
385
400
  fun.null_handling = FunctionNullHandling::SPECIAL_HANDLING;
386
401
  fun.serialize = ListLambdaBindData::Serialize;
387
402
  fun.deserialize = ListLambdaBindData::Deserialize;
403
+ fun.format_serialize = ListLambdaBindData::FormatSerialize;
404
+ fun.format_deserialize = ListLambdaBindData::FormatDeserialize;
388
405
  return fun;
389
406
  }
390
407
 
@@ -394,6 +411,8 @@ ScalarFunction ListFilterFun::GetFunction() {
394
411
  fun.null_handling = FunctionNullHandling::SPECIAL_HANDLING;
395
412
  fun.serialize = ListLambdaBindData::Serialize;
396
413
  fun.deserialize = ListLambdaBindData::Deserialize;
414
+ fun.format_serialize = ListLambdaBindData::FormatSerialize;
415
+ fun.format_deserialize = ListLambdaBindData::FormatDeserialize;
397
416
  return fun;
398
417
  }
399
418
 
@@ -218,22 +218,11 @@ AggregateFunction CountFun::GetFunction() {
218
218
  return fun;
219
219
  }
220
220
 
221
- static void CountStarSerialize(FieldWriter &writer, const FunctionData *bind_data, const AggregateFunction &function) {
222
- }
223
-
224
- static unique_ptr<FunctionData> CountStarDeserialize(PlanDeserializationState &state, FieldReader &reader,
225
- AggregateFunction &function) {
226
- return nullptr;
227
- }
228
-
229
221
  AggregateFunction CountStarFun::GetFunction() {
230
222
  auto fun = AggregateFunction::NullaryAggregate<int64_t, int64_t, CountStarFunction>(LogicalType::BIGINT);
231
223
  fun.name = "count_star";
232
224
  fun.null_handling = FunctionNullHandling::SPECIAL_HANDLING;
233
225
  fun.window = CountStarFunction::Window<int64_t>;
234
- // TODO is there a better way to set those?
235
- fun.serialize = CountStarSerialize;
236
- fun.deserialize = CountStarDeserialize;
237
226
  return fun;
238
227
  }
239
228
 
@@ -516,14 +516,6 @@ struct SortedAggregateFunction {
516
516
 
517
517
  result.Verify(count);
518
518
  }
519
-
520
- static void Serialize(FieldWriter &writer, const FunctionData *bind_data, const AggregateFunction &function) {
521
- throw NotImplementedException("FIXME: serialize sorted aggregate not supported");
522
- }
523
- static unique_ptr<FunctionData> Deserialize(PlanDeserializationState &state, FieldReader &reader,
524
- AggregateFunction &function) {
525
- throw NotImplementedException("FIXME: deserialize sorted aggregate not supported");
526
- }
527
519
  };
528
520
 
529
521
  void FunctionBinder::BindSortedAggregate(ClientContext &context, BoundAggregateExpression &expr,
@@ -582,7 +574,7 @@ void FunctionBinder::BindSortedAggregate(ClientContext &context, BoundAggregateE
582
574
  AggregateFunction::StateCombine<SortedAggregateState, SortedAggregateFunction>,
583
575
  SortedAggregateFunction::Finalize, bound_function.null_handling, SortedAggregateFunction::SimpleUpdate, nullptr,
584
576
  AggregateFunction::StateDestroy<SortedAggregateState, SortedAggregateFunction>, nullptr,
585
- SortedAggregateFunction::Window, SortedAggregateFunction::Serialize, SortedAggregateFunction::Deserialize);
577
+ SortedAggregateFunction::Window);
586
578
 
587
579
  expr.function = std::move(ordered_aggregate);
588
580
  expr.bind_info = std::move(sorted_bind);
@@ -286,6 +286,17 @@ static unique_ptr<FunctionData> ExportStateAggregateDeserialize(PlanDeserializat
286
286
  throw NotImplementedException("FIXME: export state deserialize");
287
287
  }
288
288
 
289
+ static void ExportStateAggregateFormatSerialize(FormatSerializer &serializer,
290
+ const optional_ptr<FunctionData> bind_data_p,
291
+ const AggregateFunction &function) {
292
+ throw SerializationException("FIXME: export state serialize");
293
+ }
294
+
295
+ static unique_ptr<FunctionData> ExportStateAggregateFormatDeserialize(FormatDeserializer &deserializer,
296
+ AggregateFunction &function) {
297
+ throw SerializationException("FIXME: export state deserialize");
298
+ }
299
+
289
300
  static void ExportStateScalarSerialize(FieldWriter &writer, const FunctionData *bind_data_p,
290
301
  const ScalarFunction &function) {
291
302
  throw NotImplementedException("FIXME: export state serialize");
@@ -295,6 +306,16 @@ static unique_ptr<FunctionData> ExportStateScalarDeserialize(PlanDeserialization
295
306
  throw NotImplementedException("FIXME: export state deserialize");
296
307
  }
297
308
 
309
+ static void ExportStateScalarFormatSerialize(FormatSerializer &serializer, const optional_ptr<FunctionData> bind_data_p,
310
+ const ScalarFunction &function) {
311
+ throw SerializationException("FIXME: export state serialize");
312
+ }
313
+
314
+ static unique_ptr<FunctionData> ExportStateScalarFormatDeserialize(FormatDeserializer &deserializer,
315
+ ScalarFunction &function) {
316
+ throw SerializationException("FIXME: export state deserialize");
317
+ }
318
+
298
319
  unique_ptr<BoundAggregateExpression>
299
320
  ExportAggregateFunction::Bind(unique_ptr<BoundAggregateExpression> child_aggregate) {
300
321
  auto &bound_function = child_aggregate->function;
@@ -331,6 +352,8 @@ ExportAggregateFunction::Bind(unique_ptr<BoundAggregateExpression> child_aggrega
331
352
  export_function.null_handling = FunctionNullHandling::SPECIAL_HANDLING;
332
353
  export_function.serialize = ExportStateAggregateSerialize;
333
354
  export_function.deserialize = ExportStateAggregateDeserialize;
355
+ export_function.format_serialize = ExportStateAggregateFormatSerialize;
356
+ export_function.format_deserialize = ExportStateAggregateFormatDeserialize;
334
357
 
335
358
  return make_uniq<BoundAggregateExpression>(export_function, std::move(child_aggregate->children),
336
359
  std::move(child_aggregate->filter), std::move(export_bind_data),
@@ -343,6 +366,8 @@ ScalarFunction ExportAggregateFunction::GetFinalize() {
343
366
  result.null_handling = FunctionNullHandling::SPECIAL_HANDLING;
344
367
  result.serialize = ExportStateScalarSerialize;
345
368
  result.deserialize = ExportStateScalarDeserialize;
369
+ result.format_serialize = ExportStateScalarFormatSerialize;
370
+ result.format_deserialize = ExportStateScalarFormatDeserialize;
346
371
  return result;
347
372
  }
348
373
 
@@ -353,6 +378,8 @@ ScalarFunction ExportAggregateFunction::GetCombine() {
353
378
  result.null_handling = FunctionNullHandling::SPECIAL_HANDLING;
354
379
  result.serialize = ExportStateScalarSerialize;
355
380
  result.deserialize = ExportStateScalarDeserialize;
381
+ result.format_serialize = ExportStateScalarFormatSerialize;
382
+ result.format_deserialize = ExportStateScalarFormatDeserialize;
356
383
  return result;
357
384
  }
358
385
 
@@ -13,7 +13,8 @@ ScalarFunction::ScalarFunction(string name, vector<LogicalType> arguments, Logic
13
13
  : BaseScalarFunction(std::move(name), std::move(arguments), std::move(return_type), side_effects,
14
14
  std::move(varargs), null_handling),
15
15
  function(std::move(function)), bind(bind), init_local_state(init_local_state), dependency(dependency),
16
- statistics(statistics), serialize(nullptr), deserialize(nullptr) {
16
+ statistics(statistics), serialize(nullptr), deserialize(nullptr), format_serialize(nullptr),
17
+ format_deserialize(nullptr) {
17
18
  }
18
19
 
19
20
  ScalarFunction::ScalarFunction(vector<LogicalType> arguments, LogicalType return_type, scalar_function_t function,
@@ -15,6 +15,8 @@
15
15
  #include "duckdb/main/client_data.hpp"
16
16
  #include "duckdb/execution/operator/persistent/csv_line_info.hpp"
17
17
  #include "duckdb/execution/operator/persistent/csv_rejects_table.hpp"
18
+ #include "duckdb/common/serializer/format_serializer.hpp"
19
+ #include "duckdb/common/serializer/format_deserializer.hpp"
18
20
 
19
21
  #include <limits>
20
22
 
@@ -1235,6 +1237,20 @@ static unique_ptr<FunctionData> CSVReaderDeserialize(PlanDeserializationState &s
1235
1237
  return std::move(result_data);
1236
1238
  }
1237
1239
 
1240
+ static void CSVReaderFormatSerialize(FormatSerializer &serializer, const optional_ptr<FunctionData> bind_data_p,
1241
+ const TableFunction &function) {
1242
+ auto &bind_data = bind_data_p->Cast<ReadCSVData>();
1243
+ serializer.WriteProperty("extra_info", function.extra_info);
1244
+ serializer.WriteProperty("csv_data", bind_data);
1245
+ }
1246
+
1247
+ static unique_ptr<FunctionData> CSVReaderFormatDeserialize(FormatDeserializer &deserializer, TableFunction &function) {
1248
+ unique_ptr<ReadCSVData> result;
1249
+ deserializer.ReadProperty("extra_info", function.extra_info);
1250
+ deserializer.ReadProperty("csv_data", result);
1251
+ return std::move(result);
1252
+ }
1253
+
1238
1254
  TableFunction ReadCSVTableFunction::GetFunction() {
1239
1255
  TableFunction read_csv("read_csv", {LogicalType::VARCHAR}, ReadCSVFunction, ReadCSVBind, ReadCSVInitGlobal,
1240
1256
  ReadCSVInitLocal);
@@ -1242,6 +1258,8 @@ TableFunction ReadCSVTableFunction::GetFunction() {
1242
1258
  read_csv.pushdown_complex_filter = CSVComplexFilterPushdown;
1243
1259
  read_csv.serialize = CSVReaderSerialize;
1244
1260
  read_csv.deserialize = CSVReaderDeserialize;
1261
+ read_csv.format_serialize = CSVReaderFormatSerialize;
1262
+ read_csv.format_deserialize = CSVReaderFormatDeserialize;
1245
1263
  read_csv.get_batch_index = CSVReaderGetBatchIndex;
1246
1264
  read_csv.cardinality = CSVReaderCardinality;
1247
1265
  read_csv.projection_pushdown = true;
@@ -15,6 +15,8 @@
15
15
  #include "duckdb/catalog/dependency_list.hpp"
16
16
  #include "duckdb/function/function_set.hpp"
17
17
  #include "duckdb/storage/table/scan_state.hpp"
18
+ #include "duckdb/common/serializer/format_serializer.hpp"
19
+ #include "duckdb/common/serializer/format_deserializer.hpp"
18
20
 
19
21
  namespace duckdb {
20
22
 
@@ -447,6 +449,35 @@ static unique_ptr<FunctionData> TableScanDeserialize(PlanDeserializationState &s
447
449
  return std::move(result);
448
450
  }
449
451
 
452
+ static void TableScanFormatSerialize(FormatSerializer &serializer, const optional_ptr<FunctionData> bind_data_p,
453
+ const TableFunction &function) {
454
+ auto &bind_data = bind_data_p->Cast<TableScanBindData>();
455
+ serializer.WriteProperty("catalog", bind_data.table.schema.catalog.GetName());
456
+ serializer.WriteProperty("schema", bind_data.table.schema.name);
457
+ serializer.WriteProperty("table", bind_data.table.name);
458
+ serializer.WriteProperty("is_index_scan", bind_data.is_index_scan);
459
+ serializer.WriteProperty("is_create_index", bind_data.is_create_index);
460
+ serializer.WriteProperty("result_ids", bind_data.result_ids);
461
+ serializer.WriteProperty("result_ids", bind_data.result_ids);
462
+ }
463
+
464
+ static unique_ptr<FunctionData> TableScanFormatDeserialize(FormatDeserializer &deserializer, TableFunction &function) {
465
+ auto catalog = deserializer.ReadProperty<string>("catalog");
466
+ auto schema = deserializer.ReadProperty<string>("schema");
467
+ auto table = deserializer.ReadProperty<string>("table");
468
+ auto &catalog_entry =
469
+ Catalog::GetEntry<TableCatalogEntry>(deserializer.Get<ClientContext &>(), catalog, schema, table);
470
+ if (catalog_entry.type != CatalogType::TABLE_ENTRY) {
471
+ throw SerializationException("Cant find table for %s.%s", schema, table);
472
+ }
473
+ auto result = make_uniq<TableScanBindData>(catalog_entry.Cast<DuckTableEntry>());
474
+ deserializer.ReadProperty("is_index_scan", result->is_index_scan);
475
+ deserializer.ReadProperty("is_create_index", result->is_create_index);
476
+ deserializer.ReadProperty("result_ids", result->result_ids);
477
+ deserializer.ReadProperty("result_ids", result->result_ids);
478
+ return std::move(result);
479
+ }
480
+
450
481
  TableFunction TableScanFunction::GetIndexScanFunction() {
451
482
  TableFunction scan_function("index_scan", {}, IndexScanFunction);
452
483
  scan_function.init_local = nullptr;
@@ -462,6 +493,8 @@ TableFunction TableScanFunction::GetIndexScanFunction() {
462
493
  scan_function.filter_pushdown = false;
463
494
  scan_function.serialize = TableScanSerialize;
464
495
  scan_function.deserialize = TableScanDeserialize;
496
+ scan_function.format_serialize = TableScanFormatSerialize;
497
+ scan_function.format_deserialize = TableScanFormatDeserialize;
465
498
  return scan_function;
466
499
  }
467
500
 
@@ -482,6 +515,8 @@ TableFunction TableScanFunction::GetFunction() {
482
515
  scan_function.filter_prune = true;
483
516
  scan_function.serialize = TableScanSerialize;
484
517
  scan_function.deserialize = TableScanDeserialize;
518
+ scan_function.format_serialize = TableScanFormatSerialize;
519
+ scan_function.format_deserialize = TableScanFormatDeserialize;
485
520
  return scan_function;
486
521
  }
487
522
 
@@ -1,8 +1,8 @@
1
1
  #ifndef DUCKDB_VERSION
2
- #define DUCKDB_VERSION "0.8.2-dev2090"
2
+ #define DUCKDB_VERSION "0.8.2-dev2133"
3
3
  #endif
4
4
  #ifndef DUCKDB_SOURCE_ID
5
- #define DUCKDB_SOURCE_ID "8d8f9f1b79"
5
+ #define DUCKDB_SOURCE_ID "726b6d1566"
6
6
  #endif
7
7
  #include "duckdb/function/table/system_functions.hpp"
8
8
  #include "duckdb/main/database.hpp"
@@ -18,8 +18,8 @@ TableFunction::TableFunction(string name, vector<LogicalType> arguments, table_f
18
18
  init_global(init_global), init_local(init_local), function(function), in_out_function(nullptr),
19
19
  in_out_function_final(nullptr), statistics(nullptr), dependency(nullptr), cardinality(nullptr),
20
20
  pushdown_complex_filter(nullptr), to_string(nullptr), table_scan_progress(nullptr), get_batch_index(nullptr),
21
- get_batch_info(nullptr), serialize(nullptr), deserialize(nullptr), projection_pushdown(false),
22
- filter_pushdown(false), filter_prune(false) {
21
+ get_batch_info(nullptr), serialize(nullptr), deserialize(nullptr), format_serialize(nullptr),
22
+ format_deserialize(nullptr), projection_pushdown(false), filter_pushdown(false), filter_prune(false) {
23
23
  }
24
24
 
25
25
  TableFunction::TableFunction(const vector<LogicalType> &arguments, table_function_t function,
@@ -32,7 +32,8 @@ TableFunction::TableFunction()
32
32
  init_local(nullptr), function(nullptr), in_out_function(nullptr), statistics(nullptr), dependency(nullptr),
33
33
  cardinality(nullptr), pushdown_complex_filter(nullptr), to_string(nullptr), table_scan_progress(nullptr),
34
34
  get_batch_index(nullptr), get_batch_info(nullptr), serialize(nullptr), deserialize(nullptr),
35
- projection_pushdown(false), filter_pushdown(false), filter_prune(false) {
35
+ format_serialize(nullptr), format_deserialize(nullptr), projection_pushdown(false), filter_pushdown(false),
36
+ filter_prune(false) {
36
37
  }
37
38
 
38
39
  bool TableFunction::Equal(const TableFunction &rhs) const {