duckdb 0.8.2-dev5120.0 → 0.8.2-dev5216.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 (38) hide show
  1. package/package.json +1 -1
  2. package/src/duckdb/extension/icu/icu-dateadd.cpp +11 -19
  3. package/src/duckdb/extension/icu/icu-datepart.cpp +44 -53
  4. package/src/duckdb/extension/icu/icu-datesub.cpp +10 -15
  5. package/src/duckdb/extension/icu/icu-datetrunc.cpp +6 -8
  6. package/src/duckdb/extension/icu/icu-list-range.cpp +6 -8
  7. package/src/duckdb/extension/icu/icu-makedate.cpp +8 -10
  8. package/src/duckdb/extension/icu/icu-strptime.cpp +30 -32
  9. package/src/duckdb/extension/icu/icu-table-range.cpp +6 -9
  10. package/src/duckdb/extension/icu/icu-timebucket.cpp +5 -7
  11. package/src/duckdb/extension/icu/icu-timezone.cpp +18 -29
  12. package/src/duckdb/extension/icu/icu_extension.cpp +18 -25
  13. package/src/duckdb/extension/icu/include/icu-dateadd.hpp +1 -1
  14. package/src/duckdb/extension/icu/include/icu-datepart.hpp +1 -1
  15. package/src/duckdb/extension/icu/include/icu-datesub.hpp +1 -1
  16. package/src/duckdb/extension/icu/include/icu-datetrunc.hpp +1 -1
  17. package/src/duckdb/extension/icu/include/icu-list-range.hpp +1 -1
  18. package/src/duckdb/extension/icu/include/icu-makedate.hpp +1 -1
  19. package/src/duckdb/extension/icu/include/icu-strptime.hpp +1 -1
  20. package/src/duckdb/extension/icu/include/icu-table-range.hpp +1 -1
  21. package/src/duckdb/extension/icu/include/icu-timebucket.hpp +1 -1
  22. package/src/duckdb/extension/icu/include/icu-timezone.hpp +1 -1
  23. package/src/duckdb/extension/json/buffered_json_reader.cpp +2 -2
  24. package/src/duckdb/extension/json/json_functions/read_json.cpp +15 -0
  25. package/src/duckdb/src/catalog/catalog.cpp +6 -1
  26. package/src/duckdb/src/execution/operator/csv_scanner/parallel_csv_reader.cpp +14 -0
  27. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_detection.cpp +22 -22
  28. package/src/duckdb/src/execution/operator/schema/physical_attach.cpp +4 -1
  29. package/src/duckdb/src/function/table/read_csv.cpp +3 -1
  30. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  31. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +34 -0
  32. package/src/duckdb/src/include/duckdb/main/extension_util.hpp +14 -0
  33. package/src/duckdb/src/include/duckdb/main/settings.hpp +1 -1
  34. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +2 -0
  35. package/src/duckdb/src/main/extension/extension_util.cpp +56 -0
  36. package/src/duckdb/src/planner/binder.cpp +5 -1
  37. package/src/duckdb/src/storage/checkpoint_manager.cpp +162 -138
  38. package/src/duckdb/src/storage/storage_info.cpp +1 -1
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "duckdb",
3
3
  "main": "./lib/duckdb.js",
4
4
  "types": "./lib/duckdb.d.ts",
5
- "version": "0.8.2-dev5120.0",
5
+ "version": "0.8.2-dev5216.0",
6
6
  "description": "DuckDB node.js API",
7
7
  "gypfile": true,
8
8
  "dependencies": {
@@ -1,5 +1,6 @@
1
1
  #include "include/icu-dateadd.hpp"
2
2
 
3
+ #include "duckdb/main/extension_util.hpp"
3
4
  #include "duckdb/common/operator/add.hpp"
4
5
  #include "duckdb/common/operator/multiply.hpp"
5
6
  #include "duckdb/common/types/time.hpp"
@@ -237,17 +238,14 @@ struct ICUDateAdd : public ICUDateFunc {
237
238
  return GetBinaryDateFunction<TA, TB, timestamp_t, OP>(left_type, right_type, LogicalType::TIMESTAMP_TZ);
238
239
  }
239
240
 
240
- static void AddDateAddOperators(const string &name, ClientContext &context) {
241
+ static void AddDateAddOperators(const string &name, DatabaseInstance &db) {
241
242
  // temporal + interval
242
243
  ScalarFunctionSet set(name);
243
244
  set.AddFunction(GetDateAddFunction<timestamp_t, interval_t, ICUCalendarAdd>(LogicalType::TIMESTAMP_TZ,
244
245
  LogicalType::INTERVAL));
245
246
  set.AddFunction(GetDateAddFunction<interval_t, timestamp_t, ICUCalendarAdd>(LogicalType::INTERVAL,
246
247
  LogicalType::TIMESTAMP_TZ));
247
-
248
- CreateScalarFunctionInfo func_info(set);
249
- auto &catalog = Catalog::GetSystemCatalog(context);
250
- catalog.AddFunction(context, func_info);
248
+ ExtensionUtil::AddFunctionOverload(db, set);
251
249
  }
252
250
 
253
251
  template <typename TA, typename OP>
@@ -260,7 +258,7 @@ struct ICUDateAdd : public ICUDateFunc {
260
258
  return GetBinaryDateFunction<TA, TB, interval_t, OP>(left_type, right_type, LogicalType::INTERVAL);
261
259
  }
262
260
 
263
- static void AddDateSubOperators(const string &name, ClientContext &context) {
261
+ static void AddDateSubOperators(const string &name, DatabaseInstance &db) {
264
262
  // temporal - interval
265
263
  ScalarFunctionSet set(name);
266
264
  set.AddFunction(GetDateAddFunction<timestamp_t, interval_t, ICUCalendarSub>(LogicalType::TIMESTAMP_TZ,
@@ -269,22 +267,16 @@ struct ICUDateAdd : public ICUDateFunc {
269
267
  // temporal - temporal
270
268
  set.AddFunction(GetBinaryAgeFunction<timestamp_t, timestamp_t, ICUCalendarSub>(LogicalType::TIMESTAMP_TZ,
271
269
  LogicalType::TIMESTAMP_TZ));
272
-
273
- CreateScalarFunctionInfo func_info(set);
274
- auto &catalog = Catalog::GetSystemCatalog(context);
275
- catalog.AddFunction(context, func_info);
270
+ ExtensionUtil::AddFunctionOverload(db, set);
276
271
  }
277
272
 
278
- static void AddDateAgeFunctions(const string &name, ClientContext &context) {
273
+ static void AddDateAgeFunctions(const string &name, DatabaseInstance &db) {
279
274
  // age(temporal, temporal)
280
275
  ScalarFunctionSet set(name);
281
276
  set.AddFunction(GetBinaryAgeFunction<timestamp_t, timestamp_t, ICUCalendarAge>(LogicalType::TIMESTAMP_TZ,
282
277
  LogicalType::TIMESTAMP_TZ));
283
278
  set.AddFunction(GetUnaryAgeFunction<timestamp_t, ICUCalendarAge>(LogicalType::TIMESTAMP_TZ));
284
-
285
- CreateScalarFunctionInfo func_info(set);
286
- auto &catalog = Catalog::GetSystemCatalog(context);
287
- catalog.AddFunction(context, func_info);
279
+ ExtensionUtil::AddFunctionOverload(db, set);
288
280
  }
289
281
  };
290
282
 
@@ -300,10 +292,10 @@ interval_t ICUDateFunc::Sub(icu::Calendar *calendar, timestamp_t end_date, times
300
292
  return ICUCalendarSub::Operation<timestamp_t, timestamp_t, interval_t>(end_date, start_date, calendar);
301
293
  }
302
294
 
303
- void RegisterICUDateAddFunctions(ClientContext &context) {
304
- ICUDateAdd::AddDateAddOperators("+", context);
305
- ICUDateAdd::AddDateSubOperators("-", context);
306
- ICUDateAdd::AddDateAgeFunctions("age", context);
295
+ void RegisterICUDateAddFunctions(DatabaseInstance &db) {
296
+ ICUDateAdd::AddDateAddOperators("+", db);
297
+ ICUDateAdd::AddDateSubOperators("-", db);
298
+ ICUDateAdd::AddDateAgeFunctions("age", db);
307
299
  }
308
300
 
309
301
  } // namespace duckdb
@@ -1,6 +1,7 @@
1
1
  #include "include/icu-datepart.hpp"
2
2
  #include "include/icu-datefunc.hpp"
3
3
 
4
+ #include "duckdb/main/extension_util.hpp"
4
5
  #include "duckdb/common/enums/date_part_specifier.hpp"
5
6
  #include "duckdb/common/types/date.hpp"
6
7
  #include "duckdb/common/types/timestamp.hpp"
@@ -562,13 +563,11 @@ struct ICUDatePart : public ICUDateFunc {
562
563
  }
563
564
 
564
565
  template <typename RESULT_TYPE = int64_t>
565
- static void AddUnaryPartCodeFunctions(const string &name, ClientContext &context,
566
+ static void AddUnaryPartCodeFunctions(const string &name, DatabaseInstance &db,
566
567
  const LogicalType &result_type = LogicalType::BIGINT) {
567
- auto &catalog = Catalog::GetSystemCatalog(context);
568
568
  ScalarFunctionSet set(name);
569
569
  set.AddFunction(GetUnaryPartCodeFunction<timestamp_t, RESULT_TYPE>(LogicalType::TIMESTAMP_TZ, result_type));
570
- CreateScalarFunctionInfo func_info(set);
571
- catalog.AddFunction(context, func_info);
570
+ ExtensionUtil::AddFunctionOverload(db, set);
572
571
  }
573
572
 
574
573
  template <typename INPUT_TYPE, typename RESULT_TYPE>
@@ -587,13 +586,11 @@ struct ICUDatePart : public ICUDateFunc {
587
586
  return result;
588
587
  }
589
588
 
590
- static void AddDatePartFunctions(const string &name, ClientContext &context) {
591
- auto &catalog = Catalog::GetSystemCatalog(context);
589
+ static void AddDatePartFunctions(const string &name, DatabaseInstance &db) {
592
590
  ScalarFunctionSet set(name);
593
591
  set.AddFunction(GetBinaryPartCodeFunction<timestamp_t, int64_t>(LogicalType::TIMESTAMP_TZ));
594
592
  set.AddFunction(GetStructFunction<timestamp_t>(LogicalType::TIMESTAMP_TZ));
595
- CreateScalarFunctionInfo func_info(set);
596
- catalog.AddFunction(context, func_info);
593
+ ExtensionUtil::AddFunctionOverload(db, set);
597
594
  }
598
595
 
599
596
  static duckdb::unique_ptr<FunctionData> BindLastDate(ClientContext &context, ScalarFunction &bound_function,
@@ -607,12 +604,10 @@ struct ICUDatePart : public ICUDateFunc {
607
604
  return ScalarFunction({temporal_type}, LogicalType::DATE, UnaryTimestampFunction<INPUT_TYPE, date_t>,
608
605
  BindLastDate);
609
606
  }
610
- static void AddLastDayFunctions(const string &name, ClientContext &context) {
611
- auto &catalog = Catalog::GetSystemCatalog(context);
607
+ static void AddLastDayFunctions(const string &name, DatabaseInstance &db) {
612
608
  ScalarFunctionSet set(name);
613
609
  set.AddFunction(GetLastDayFunction<timestamp_t>(LogicalType::TIMESTAMP_TZ));
614
- CreateScalarFunctionInfo func_info(set);
615
- catalog.AddFunction(context, func_info);
610
+ ExtensionUtil::AddFunctionOverload(db, set);
616
611
  }
617
612
 
618
613
  static unique_ptr<FunctionData> BindMonthName(ClientContext &context, ScalarFunction &bound_function,
@@ -626,12 +621,10 @@ struct ICUDatePart : public ICUDateFunc {
626
621
  return ScalarFunction({temporal_type}, LogicalType::VARCHAR, UnaryTimestampFunction<INPUT_TYPE, string_t>,
627
622
  BindMonthName);
628
623
  }
629
- static void AddMonthNameFunctions(const string &name, ClientContext &context) {
630
- auto &catalog = Catalog::GetSystemCatalog(context);
624
+ static void AddMonthNameFunctions(const string &name, DatabaseInstance &db) {
631
625
  ScalarFunctionSet set(name);
632
626
  set.AddFunction(GetMonthNameFunction<timestamp_t>(LogicalType::TIMESTAMP_TZ));
633
- CreateScalarFunctionInfo func_info(set);
634
- catalog.AddFunction(context, func_info);
627
+ ExtensionUtil::AddFunctionOverload(db, set);
635
628
  }
636
629
 
637
630
  static unique_ptr<FunctionData> BindDayName(ClientContext &context, ScalarFunction &bound_function,
@@ -645,63 +638,61 @@ struct ICUDatePart : public ICUDateFunc {
645
638
  return ScalarFunction({temporal_type}, LogicalType::VARCHAR, UnaryTimestampFunction<INPUT_TYPE, string_t>,
646
639
  BindDayName);
647
640
  }
648
- static void AddDayNameFunctions(const string &name, ClientContext &context) {
649
- auto &catalog = Catalog::GetSystemCatalog(context);
641
+ static void AddDayNameFunctions(const string &name, DatabaseInstance &db) {
650
642
  ScalarFunctionSet set(name);
651
643
  set.AddFunction(GetDayNameFunction<timestamp_t>(LogicalType::TIMESTAMP_TZ));
652
- CreateScalarFunctionInfo func_info(set);
653
- catalog.AddFunction(context, func_info);
644
+ ExtensionUtil::AddFunctionOverload(db, set);
654
645
  }
655
646
  };
656
647
 
657
- void RegisterICUDatePartFunctions(ClientContext &context) {
648
+ void RegisterICUDatePartFunctions(DatabaseInstance &db) {
658
649
  // register the individual operators
659
650
 
660
651
  // BIGINTs
661
- ICUDatePart::AddUnaryPartCodeFunctions("era", context);
662
- ICUDatePart::AddUnaryPartCodeFunctions("year", context);
663
- ICUDatePart::AddUnaryPartCodeFunctions("month", context);
664
- ICUDatePart::AddUnaryPartCodeFunctions("day", context);
665
- ICUDatePart::AddUnaryPartCodeFunctions("decade", context);
666
- ICUDatePart::AddUnaryPartCodeFunctions("century", context);
667
- ICUDatePart::AddUnaryPartCodeFunctions("millennium", context);
668
- ICUDatePart::AddUnaryPartCodeFunctions("microsecond", context);
669
- ICUDatePart::AddUnaryPartCodeFunctions("millisecond", context);
670
- ICUDatePart::AddUnaryPartCodeFunctions("second", context);
671
- ICUDatePart::AddUnaryPartCodeFunctions("minute", context);
672
- ICUDatePart::AddUnaryPartCodeFunctions("hour", context);
673
- ICUDatePart::AddUnaryPartCodeFunctions("dayofweek", context);
674
- ICUDatePart::AddUnaryPartCodeFunctions("isodow", context);
675
- ICUDatePart::AddUnaryPartCodeFunctions("week", context); // Note that WeekOperator is ISO-8601, not US
676
- ICUDatePart::AddUnaryPartCodeFunctions("dayofyear", context);
677
- ICUDatePart::AddUnaryPartCodeFunctions("quarter", context);
678
- ICUDatePart::AddUnaryPartCodeFunctions("isoyear", context);
679
- ICUDatePart::AddUnaryPartCodeFunctions("timezone", context);
680
- ICUDatePart::AddUnaryPartCodeFunctions("timezone_hour", context);
681
- ICUDatePart::AddUnaryPartCodeFunctions("timezone_minute", context);
652
+ ICUDatePart::AddUnaryPartCodeFunctions("era", db);
653
+ ICUDatePart::AddUnaryPartCodeFunctions("year", db);
654
+ ICUDatePart::AddUnaryPartCodeFunctions("month", db);
655
+ ICUDatePart::AddUnaryPartCodeFunctions("day", db);
656
+ ICUDatePart::AddUnaryPartCodeFunctions("decade", db);
657
+ ICUDatePart::AddUnaryPartCodeFunctions("century", db);
658
+ ICUDatePart::AddUnaryPartCodeFunctions("millennium", db);
659
+ ICUDatePart::AddUnaryPartCodeFunctions("microsecond", db);
660
+ ICUDatePart::AddUnaryPartCodeFunctions("millisecond", db);
661
+ ICUDatePart::AddUnaryPartCodeFunctions("second", db);
662
+ ICUDatePart::AddUnaryPartCodeFunctions("minute", db);
663
+ ICUDatePart::AddUnaryPartCodeFunctions("hour", db);
664
+ ICUDatePart::AddUnaryPartCodeFunctions("dayofweek", db);
665
+ ICUDatePart::AddUnaryPartCodeFunctions("isodow", db);
666
+ ICUDatePart::AddUnaryPartCodeFunctions("week", db); // Note that WeekOperator is ISO-8601, not US
667
+ ICUDatePart::AddUnaryPartCodeFunctions("dayofyear", db);
668
+ ICUDatePart::AddUnaryPartCodeFunctions("quarter", db);
669
+ ICUDatePart::AddUnaryPartCodeFunctions("isoyear", db);
670
+ ICUDatePart::AddUnaryPartCodeFunctions("timezone", db);
671
+ ICUDatePart::AddUnaryPartCodeFunctions("timezone_hour", db);
672
+ ICUDatePart::AddUnaryPartCodeFunctions("timezone_minute", db);
682
673
 
683
674
  // DOUBLEs
684
- ICUDatePart::AddUnaryPartCodeFunctions<double>("epoch", context, LogicalType::DOUBLE);
685
- ICUDatePart::AddUnaryPartCodeFunctions<double>("julian", context, LogicalType::DOUBLE);
675
+ ICUDatePart::AddUnaryPartCodeFunctions<double>("epoch", db, LogicalType::DOUBLE);
676
+ ICUDatePart::AddUnaryPartCodeFunctions<double>("julian", db, LogicalType::DOUBLE);
686
677
 
687
678
  // register combinations
688
- ICUDatePart::AddUnaryPartCodeFunctions("yearweek", context); // Note this is ISO year and week
679
+ ICUDatePart::AddUnaryPartCodeFunctions("yearweek", db); // Note this is ISO year and week
689
680
 
690
681
  // register various aliases
691
- ICUDatePart::AddUnaryPartCodeFunctions("dayofmonth", context);
692
- ICUDatePart::AddUnaryPartCodeFunctions("weekday", context);
693
- ICUDatePart::AddUnaryPartCodeFunctions("weekofyear", context);
682
+ ICUDatePart::AddUnaryPartCodeFunctions("dayofmonth", db);
683
+ ICUDatePart::AddUnaryPartCodeFunctions("weekday", db);
684
+ ICUDatePart::AddUnaryPartCodeFunctions("weekofyear", db);
694
685
 
695
686
  // register the last_day function
696
- ICUDatePart::AddLastDayFunctions("last_day", context);
687
+ ICUDatePart::AddLastDayFunctions("last_day", db);
697
688
 
698
689
  // register the dayname/monthname functions
699
- ICUDatePart::AddMonthNameFunctions("monthname", context);
700
- ICUDatePart::AddDayNameFunctions("dayname", context);
690
+ ICUDatePart::AddMonthNameFunctions("monthname", db);
691
+ ICUDatePart::AddDayNameFunctions("dayname", db);
701
692
 
702
693
  // finally the actual date_part function
703
- ICUDatePart::AddDatePartFunctions("date_part", context);
704
- ICUDatePart::AddDatePartFunctions("datepart", context);
694
+ ICUDatePart::AddDatePartFunctions("date_part", db);
695
+ ICUDatePart::AddDatePartFunctions("datepart", db);
705
696
  }
706
697
 
707
698
  } // namespace duckdb
@@ -1,6 +1,7 @@
1
1
  #include "include/icu-datesub.hpp"
2
2
  #include "include/icu-datefunc.hpp"
3
3
 
4
+ #include "duckdb/main/extension_util.hpp"
4
5
  #include "duckdb/common/enums/date_part_specifier.hpp"
5
6
  #include "duckdb/common/types/timestamp.hpp"
6
7
  #include "duckdb/parser/parsed_data/create_scalar_function_info.hpp"
@@ -138,13 +139,10 @@ struct ICUCalendarSub : public ICUDateFunc {
138
139
  return ScalarFunction({LogicalType::VARCHAR, type, type}, LogicalType::BIGINT, ICUDateSubFunction<TA>, Bind);
139
140
  }
140
141
 
141
- static void AddFunctions(const string &name, ClientContext &context) {
142
+ static void AddFunctions(const string &name, DatabaseInstance &db) {
142
143
  ScalarFunctionSet set(name);
143
144
  set.AddFunction(GetFunction<timestamp_t>(LogicalType::TIMESTAMP_TZ));
144
-
145
- CreateScalarFunctionInfo func_info(set);
146
- auto &catalog = Catalog::GetSystemCatalog(context);
147
- catalog.AddFunction(context, func_info);
145
+ ExtensionUtil::AddFunctionOverload(db, set);
148
146
  }
149
147
  };
150
148
 
@@ -266,22 +264,19 @@ struct ICUCalendarDiff : public ICUDateFunc {
266
264
  return ScalarFunction({LogicalType::VARCHAR, type, type}, LogicalType::BIGINT, ICUDateDiffFunction<TA>, Bind);
267
265
  }
268
266
 
269
- static void AddFunctions(const string &name, ClientContext &context) {
267
+ static void AddFunctions(const string &name, DatabaseInstance &db) {
270
268
  ScalarFunctionSet set(name);
271
269
  set.AddFunction(GetFunction<timestamp_t>(LogicalType::TIMESTAMP_TZ));
272
-
273
- CreateScalarFunctionInfo func_info(set);
274
- auto &catalog = Catalog::GetSystemCatalog(context);
275
- catalog.AddFunction(context, func_info);
270
+ ExtensionUtil::AddFunctionOverload(db, set);
276
271
  }
277
272
  };
278
273
 
279
- void RegisterICUDateSubFunctions(ClientContext &context) {
280
- ICUCalendarSub::AddFunctions("date_sub", context);
281
- ICUCalendarSub::AddFunctions("datesub", context);
274
+ void RegisterICUDateSubFunctions(DatabaseInstance &db) {
275
+ ICUCalendarSub::AddFunctions("date_sub", db);
276
+ ICUCalendarSub::AddFunctions("datesub", db);
282
277
 
283
- ICUCalendarDiff::AddFunctions("date_diff", context);
284
- ICUCalendarDiff::AddFunctions("datediff", context);
278
+ ICUCalendarDiff::AddFunctions("date_diff", db);
279
+ ICUCalendarDiff::AddFunctions("datediff", db);
285
280
  }
286
281
 
287
282
  } // namespace duckdb
@@ -7,6 +7,7 @@
7
7
  #include "duckdb/main/client_context.hpp"
8
8
  #include "duckdb/parser/parsed_data/create_scalar_function_info.hpp"
9
9
  #include "duckdb/planner/expression/bound_function_expression.hpp"
10
+ #include "duckdb/main/extension_util.hpp"
10
11
 
11
12
  namespace duckdb {
12
13
 
@@ -140,13 +141,10 @@ struct ICUDateTrunc : public ICUDateFunc {
140
141
  return ScalarFunction({LogicalType::VARCHAR, type}, LogicalType::TIMESTAMP_TZ, ICUDateTruncFunction<TA>, Bind);
141
142
  }
142
143
 
143
- static void AddBinaryTimestampFunction(const string &name, ClientContext &context) {
144
+ static void AddBinaryTimestampFunction(const string &name, DatabaseInstance &db) {
144
145
  ScalarFunctionSet set(name);
145
146
  set.AddFunction(GetDateTruncFunction<timestamp_t>(LogicalType::TIMESTAMP_TZ));
146
-
147
- CreateScalarFunctionInfo func_info(set);
148
- auto &catalog = Catalog::GetSystemCatalog(context);
149
- catalog.AddFunction(context, func_info);
147
+ ExtensionUtil::AddFunctionOverload(db, set);
150
148
  }
151
149
  };
152
150
 
@@ -193,9 +191,9 @@ ICUDateFunc::part_trunc_t ICUDateFunc::TruncationFactory(DatePartSpecifier type)
193
191
  }
194
192
  }
195
193
 
196
- void RegisterICUDateTruncFunctions(ClientContext &context) {
197
- ICUDateTrunc::AddBinaryTimestampFunction("date_trunc", context);
198
- ICUDateTrunc::AddBinaryTimestampFunction("datetrunc", context);
194
+ void RegisterICUDateTruncFunctions(DatabaseInstance &db) {
195
+ ICUDateTrunc::AddBinaryTimestampFunction("date_trunc", db);
196
+ ICUDateTrunc::AddBinaryTimestampFunction("datetrunc", db);
199
197
  }
200
198
 
201
199
  } // namespace duckdb
@@ -7,6 +7,7 @@
7
7
  #include "duckdb/main/client_context.hpp"
8
8
  #include "duckdb/parser/parsed_data/create_scalar_function_info.hpp"
9
9
  #include "include/icu-datefunc.hpp"
10
+ #include "duckdb/main/extension_util.hpp"
10
11
 
11
12
  namespace duckdb {
12
13
 
@@ -180,28 +181,25 @@ struct ICUListRange : public ICUDateFunc {
180
181
  result.Verify(args.size());
181
182
  }
182
183
 
183
- static void AddICUListRangeFunction(ClientContext &context) {
184
- auto &catalog = Catalog::GetSystemCatalog(context);
184
+ static void AddICUListRangeFunction(DatabaseInstance &db) {
185
185
 
186
186
  ScalarFunctionSet range("range");
187
187
  range.AddFunction(ScalarFunction({LogicalType::TIMESTAMP_TZ, LogicalType::TIMESTAMP_TZ, LogicalType::INTERVAL},
188
188
  LogicalType::LIST(LogicalType::TIMESTAMP_TZ), ICUListRangeFunction<false>,
189
189
  Bind));
190
- CreateScalarFunctionInfo range_func_info(range);
191
- catalog.AddFunction(context, range_func_info);
190
+ ExtensionUtil::AddFunctionOverload(db, range);
192
191
 
193
192
  // generate_series: similar to range, but inclusive instead of exclusive bounds on the RHS
194
193
  ScalarFunctionSet generate_series("generate_series");
195
194
  generate_series.AddFunction(
196
195
  ScalarFunction({LogicalType::TIMESTAMP_TZ, LogicalType::TIMESTAMP_TZ, LogicalType::INTERVAL},
197
196
  LogicalType::LIST(LogicalType::TIMESTAMP_TZ), ICUListRangeFunction<true>, Bind));
198
- CreateScalarFunctionInfo generate_series_func_info(generate_series);
199
- catalog.AddFunction(context, generate_series_func_info);
197
+ ExtensionUtil::AddFunctionOverload(db, generate_series);
200
198
  }
201
199
  };
202
200
 
203
- void RegisterICUListRangeFunctions(ClientContext &context) {
204
- ICUListRange::AddICUListRangeFunction(context);
201
+ void RegisterICUListRangeFunctions(DatabaseInstance &db) {
202
+ ICUListRange::AddICUListRangeFunction(db);
205
203
  }
206
204
 
207
205
  } // namespace duckdb
@@ -7,6 +7,7 @@
7
7
  #include "duckdb/common/vector_operations/senary_executor.hpp"
8
8
  #include "duckdb/common/vector_operations/septenary_executor.hpp"
9
9
  #include "duckdb/function/cast/cast_function_set.hpp"
10
+ #include "duckdb/main/extension_util.hpp"
10
11
  #include "duckdb/parser/parsed_data/create_scalar_function_info.hpp"
11
12
  #include "include/icu-datefunc.hpp"
12
13
  #include "include/icu-datetrunc.hpp"
@@ -57,8 +58,8 @@ struct ICUMakeDate : public ICUDateFunc {
57
58
  return BoundCastInfo(CastToDate, std::move(cast_data));
58
59
  }
59
60
 
60
- static void AddCasts(ClientContext &context) {
61
- auto &config = DBConfig::GetConfig(context);
61
+ static void AddCasts(DatabaseInstance &db) {
62
+ auto &config = DBConfig::GetConfig(db);
62
63
  auto &casts = config.GetCastFunctions();
63
64
 
64
65
  casts.RegisterCastFunction(LogicalType::TIMESTAMP_TZ, LogicalType::DATE, BindCastToDate);
@@ -146,21 +147,18 @@ struct ICUMakeTimestampTZFunc : public ICUDateFunc {
146
147
  LogicalType::TIMESTAMP_TZ, Execute<TA>, Bind);
147
148
  }
148
149
 
149
- static void AddFunction(const string &name, ClientContext &context) {
150
+ static void AddFunction(const string &name, DatabaseInstance &db) {
150
151
  ScalarFunctionSet set(name);
151
152
  set.AddFunction(GetSenaryFunction<int64_t>(LogicalType::BIGINT));
152
153
  set.AddFunction(GetSeptenaryFunction<int64_t>(LogicalType::BIGINT));
153
154
  set.AddFunction(ScalarFunction({LogicalType::BIGINT}, LogicalType::TIMESTAMP_TZ, FromMicros<int64_t>));
154
-
155
- CreateScalarFunctionInfo func_info(set);
156
- auto &catalog = Catalog::GetSystemCatalog(context);
157
- catalog.AddFunction(context, func_info);
155
+ ExtensionUtil::RegisterFunction(db, set);
158
156
  }
159
157
  };
160
158
 
161
- void RegisterICUMakeDateFunctions(ClientContext &context) {
162
- ICUMakeTimestampTZFunc::AddFunction("make_timestamptz", context);
163
- ICUMakeDate::AddCasts(context);
159
+ void RegisterICUMakeDateFunctions(DatabaseInstance &db) {
160
+ ICUMakeTimestampTZFunc::AddFunction("make_timestamptz", db);
161
+ ICUMakeDate::AddCasts(db);
164
162
  }
165
163
 
166
164
  } // namespace duckdb
@@ -15,6 +15,7 @@
15
15
  #include "duckdb/planner/expression/bound_function_expression.hpp"
16
16
  #include "duckdb/function/function_binder.hpp"
17
17
  #include "duckdb/function/cast/default_casts.hpp"
18
+ #include "duckdb/main/extension_util.hpp"
18
19
 
19
20
  namespace duckdb {
20
21
 
@@ -211,32 +212,32 @@ struct ICUStrptime : public ICUDateFunc {
211
212
  return bind_strptime(context, bound_function, arguments);
212
213
  }
213
214
 
214
- static void TailPatch(const string &name, ClientContext &context, const vector<LogicalType> &types) {
215
+ static void TailPatch(const string &name, DatabaseInstance &db, const vector<LogicalType> &types) {
215
216
  // Find the old function
216
- auto &catalog = Catalog::GetSystemCatalog(context);
217
- auto &entry = catalog.GetEntry(context, CatalogType::SCALAR_FUNCTION_ENTRY, DEFAULT_SCHEMA, name);
218
- D_ASSERT(entry.type == CatalogType::SCALAR_FUNCTION_ENTRY);
219
- auto &func = entry.Cast<ScalarFunctionCatalogEntry>();
220
- string error;
221
-
222
- FunctionBinder function_binder(context);
223
- const idx_t best_function = function_binder.BindFunction(func.name, func.functions, types, error);
224
- if (best_function == DConstants::INVALID_INDEX) {
225
- return;
217
+ auto &scalar_function = ExtensionUtil::GetFunction(db, name);
218
+ auto &functions = scalar_function.functions.functions;
219
+ optional_idx best_index;
220
+ for (idx_t i = 0; i < functions.size(); i++) {
221
+ auto &function = functions[i];
222
+ if (types == function.arguments) {
223
+ best_index = i;
224
+ break;
225
+ }
226
226
  }
227
-
228
- // Tail patch the old binder
229
- auto &bound_function = func.functions.GetFunctionReferenceByOffset(best_function);
227
+ if (!best_index.IsValid()) {
228
+ throw InternalException("ICU - Function for TailPatch not found");
229
+ }
230
+ auto &bound_function = functions[best_index.GetIndex()];
230
231
  bind_strptime = bound_function.bind;
231
232
  bound_function.bind = StrpTimeBindFunction;
232
233
  }
233
234
 
234
- static void AddBinaryTimestampFunction(const string &name, ClientContext &context) {
235
+ static void AddBinaryTimestampFunction(const string &name, DatabaseInstance &db) {
235
236
  vector<LogicalType> types {LogicalType::VARCHAR, LogicalType::VARCHAR};
236
- TailPatch(name, context, types);
237
+ TailPatch(name, db, types);
237
238
 
238
239
  types[1] = LogicalType::LIST(LogicalType::VARCHAR);
239
- TailPatch(name, context, types);
240
+ TailPatch(name, db, types);
240
241
  }
241
242
 
242
243
  static bool CastFromVarchar(Vector &source, Vector &result, idx_t count, CastParameters &parameters) {
@@ -284,8 +285,8 @@ struct ICUStrptime : public ICUDateFunc {
284
285
  return BoundCastInfo(CastFromVarchar, std::move(cast_data));
285
286
  }
286
287
 
287
- static void AddCasts(ClientContext &context) {
288
- auto &config = DBConfig::GetConfig(context);
288
+ static void AddCasts(DatabaseInstance &db) {
289
+ auto &config = DBConfig::GetConfig(db);
289
290
  auto &casts = config.GetCastFunctions();
290
291
 
291
292
  casts.RegisterCastFunction(LogicalType::VARCHAR, LogicalType::TIMESTAMP_TZ, BindCastFromVarchar);
@@ -383,14 +384,11 @@ struct ICUStrftime : public ICUDateFunc {
383
384
  }
384
385
  }
385
386
 
386
- static void AddBinaryTimestampFunction(const string &name, ClientContext &context) {
387
+ static void AddBinaryTimestampFunction(const string &name, DatabaseInstance &db) {
387
388
  ScalarFunctionSet set(name);
388
389
  set.AddFunction(ScalarFunction({LogicalType::TIMESTAMP_TZ, LogicalType::VARCHAR}, LogicalType::VARCHAR,
389
390
  ICUStrftimeFunction, Bind));
390
-
391
- CreateScalarFunctionInfo func_info(set);
392
- auto &catalog = Catalog::GetSystemCatalog(context);
393
- catalog.AddFunction(context, func_info);
391
+ ExtensionUtil::AddFunctionOverload(db, set);
394
392
  }
395
393
 
396
394
  static string_t CastOperation(icu::Calendar *calendar, timestamp_t input, Vector &result) {
@@ -469,23 +467,23 @@ struct ICUStrftime : public ICUDateFunc {
469
467
  return BoundCastInfo(CastToVarchar, std::move(cast_data));
470
468
  }
471
469
 
472
- static void AddCasts(ClientContext &context) {
473
- auto &config = DBConfig::GetConfig(context);
470
+ static void AddCasts(DatabaseInstance &db) {
471
+ auto &config = DBConfig::GetConfig(db);
474
472
  auto &casts = config.GetCastFunctions();
475
473
 
476
474
  casts.RegisterCastFunction(LogicalType::TIMESTAMP_TZ, LogicalType::VARCHAR, BindCastToVarchar);
477
475
  }
478
476
  };
479
477
 
480
- void RegisterICUStrptimeFunctions(ClientContext &context) {
481
- ICUStrptime::AddBinaryTimestampFunction("strptime", context);
482
- ICUStrptime::AddBinaryTimestampFunction("try_strptime", context);
478
+ void RegisterICUStrptimeFunctions(DatabaseInstance &db) {
479
+ ICUStrptime::AddBinaryTimestampFunction("strptime", db);
480
+ ICUStrptime::AddBinaryTimestampFunction("try_strptime", db);
483
481
 
484
- ICUStrftime::AddBinaryTimestampFunction("strftime", context);
482
+ ICUStrftime::AddBinaryTimestampFunction("strftime", db);
485
483
 
486
484
  // Add string casts
487
- ICUStrptime::AddCasts(context);
488
- ICUStrftime::AddCasts(context);
485
+ ICUStrptime::AddCasts(db);
486
+ ICUStrftime::AddCasts(db);
489
487
  }
490
488
 
491
489
  } // namespace duckdb
@@ -1,6 +1,7 @@
1
1
  #include "duckdb/common/exception.hpp"
2
2
  #include "duckdb/common/types/interval.hpp"
3
3
  #include "duckdb/common/types/timestamp.hpp"
4
+ #include "duckdb/main/extension_util.hpp"
4
5
  #include "duckdb/function/function_set.hpp"
5
6
  #include "duckdb/function/table_function.hpp"
6
7
  #include "duckdb/parser/parsed_data/create_table_function_info.hpp"
@@ -168,27 +169,23 @@ struct ICUTableRange {
168
169
  output.SetCardinality(size);
169
170
  }
170
171
 
171
- static void AddICUTableRangeFunction(ClientContext &context) {
172
- auto &catalog = Catalog::GetSystemCatalog(context);
173
-
172
+ static void AddICUTableRangeFunction(DatabaseInstance &db) {
174
173
  TableFunctionSet range("range");
175
174
  range.AddFunction(TableFunction({LogicalType::TIMESTAMP_TZ, LogicalType::TIMESTAMP_TZ, LogicalType::INTERVAL},
176
175
  ICUTableRangeFunction, Bind<false>, Init));
177
- CreateTableFunctionInfo range_func_info(range);
178
- catalog.AddFunction(context, range_func_info);
176
+ ExtensionUtil::AddFunctionOverload(db, range);
179
177
 
180
178
  // generate_series: similar to range, but inclusive instead of exclusive bounds on the RHS
181
179
  TableFunctionSet generate_series("generate_series");
182
180
  generate_series.AddFunction(
183
181
  TableFunction({LogicalType::TIMESTAMP_TZ, LogicalType::TIMESTAMP_TZ, LogicalType::INTERVAL},
184
182
  ICUTableRangeFunction, Bind<true>, Init));
185
- CreateTableFunctionInfo generate_series_func_info(generate_series);
186
- catalog.AddFunction(context, generate_series_func_info);
183
+ ExtensionUtil::AddFunctionOverload(db, generate_series);
187
184
  }
188
185
  };
189
186
 
190
- void RegisterICUTableRangeFunctions(ClientContext &context) {
191
- ICUTableRange::AddICUTableRangeFunction(context);
187
+ void RegisterICUTableRangeFunctions(DatabaseInstance &db) {
188
+ ICUTableRange::AddICUTableRangeFunction(db);
192
189
  }
193
190
 
194
191
  } // namespace duckdb
@@ -6,6 +6,7 @@
6
6
  #include "duckdb/common/types/time.hpp"
7
7
  #include "duckdb/common/types/timestamp.hpp"
8
8
  #include "duckdb/common/types/value.hpp"
9
+ #include "duckdb/main/extension_util.hpp"
9
10
  #include "duckdb/common/vector_operations/binary_executor.hpp"
10
11
  #include "duckdb/common/vector_operations/ternary_executor.hpp"
11
12
  #include "duckdb/main/client_context.hpp"
@@ -613,7 +614,7 @@ struct ICUTimeBucket : public ICUDateFunc {
613
614
  }
614
615
  }
615
616
 
616
- static void AddTimeBucketFunction(ClientContext &context) {
617
+ static void AddTimeBucketFunction(DatabaseInstance &db) {
617
618
  ScalarFunctionSet set("time_bucket");
618
619
  set.AddFunction(ScalarFunction({LogicalType::INTERVAL, LogicalType::TIMESTAMP_TZ}, LogicalType::TIMESTAMP_TZ,
619
620
  ICUTimeBucketFunction, Bind));
@@ -623,15 +624,12 @@ struct ICUTimeBucket : public ICUDateFunc {
623
624
  LogicalType::TIMESTAMP_TZ, ICUTimeBucketOriginFunction, Bind));
624
625
  set.AddFunction(ScalarFunction({LogicalType::INTERVAL, LogicalType::TIMESTAMP_TZ, LogicalType::VARCHAR},
625
626
  LogicalType::TIMESTAMP_TZ, ICUTimeBucketTimeZoneFunction, Bind));
626
-
627
- CreateScalarFunctionInfo func_info(set);
628
- auto &catalog = Catalog::GetSystemCatalog(context);
629
- catalog.AddFunction(context, func_info);
627
+ ExtensionUtil::AddFunctionOverload(db, set);
630
628
  }
631
629
  };
632
630
 
633
- void RegisterICUTimeBucketFunctions(ClientContext &context) {
634
- ICUTimeBucket::AddTimeBucketFunction(context);
631
+ void RegisterICUTimeBucketFunctions(DatabaseInstance &db) {
632
+ ICUTimeBucket::AddTimeBucketFunction(db);
635
633
  }
636
634
 
637
635
  } // namespace duckdb