duckdb 0.8.2-dev5080.0 → 0.8.2-dev5154.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.
- package/package.json +1 -1
- package/src/duckdb/extension/icu/icu-dateadd.cpp +11 -19
- package/src/duckdb/extension/icu/icu-datepart.cpp +44 -53
- package/src/duckdb/extension/icu/icu-datesub.cpp +10 -15
- package/src/duckdb/extension/icu/icu-datetrunc.cpp +6 -8
- package/src/duckdb/extension/icu/icu-list-range.cpp +6 -8
- package/src/duckdb/extension/icu/icu-makedate.cpp +8 -10
- package/src/duckdb/extension/icu/icu-strptime.cpp +30 -32
- package/src/duckdb/extension/icu/icu-table-range.cpp +6 -9
- package/src/duckdb/extension/icu/icu-timebucket.cpp +5 -7
- package/src/duckdb/extension/icu/icu-timezone.cpp +18 -29
- package/src/duckdb/extension/icu/icu_extension.cpp +18 -25
- package/src/duckdb/extension/icu/include/icu-dateadd.hpp +1 -1
- package/src/duckdb/extension/icu/include/icu-datepart.hpp +1 -1
- package/src/duckdb/extension/icu/include/icu-datesub.hpp +1 -1
- package/src/duckdb/extension/icu/include/icu-datetrunc.hpp +1 -1
- package/src/duckdb/extension/icu/include/icu-list-range.hpp +1 -1
- package/src/duckdb/extension/icu/include/icu-makedate.hpp +1 -1
- package/src/duckdb/extension/icu/include/icu-strptime.hpp +1 -1
- package/src/duckdb/extension/icu/include/icu-table-range.hpp +1 -1
- package/src/duckdb/extension/icu/include/icu-timebucket.hpp +1 -1
- package/src/duckdb/extension/icu/include/icu-timezone.hpp +1 -1
- package/src/duckdb/extension/json/json_functions/read_json.cpp +15 -0
- package/src/duckdb/src/catalog/catalog.cpp +4 -0
- package/src/duckdb/src/core_functions/aggregate/holistic/quantile.cpp +75 -27
- package/src/duckdb/src/core_functions/function_list.cpp +1 -1
- package/src/duckdb/src/core_functions/scalar/struct/struct_pack.cpp +22 -18
- package/src/duckdb/src/execution/operator/schema/physical_attach.cpp +4 -1
- package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
- package/src/duckdb/src/include/duckdb/core_functions/scalar/struct_functions.hpp +5 -2
- package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
- package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +26 -0
- package/src/duckdb/src/include/duckdb/main/extension_util.hpp +14 -0
- package/src/duckdb/src/include/duckdb/planner/extension_callback.hpp +26 -0
- package/src/duckdb/src/main/database.cpp +6 -0
- package/src/duckdb/src/main/extension/extension_util.cpp +56 -0
- package/src/duckdb/src/main/settings/settings.cpp +4 -0
- package/src/duckdb/src/storage/single_file_block_manager.cpp +11 -0
package/package.json
CHANGED
@@ -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,
|
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,
|
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,
|
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(
|
304
|
-
ICUDateAdd::AddDateAddOperators("+",
|
305
|
-
ICUDateAdd::AddDateSubOperators("-",
|
306
|
-
ICUDateAdd::AddDateAgeFunctions("age",
|
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,
|
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
|
-
|
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,
|
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
|
-
|
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,
|
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
|
-
|
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,
|
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
|
-
|
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,
|
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
|
-
|
653
|
-
catalog.AddFunction(context, func_info);
|
644
|
+
ExtensionUtil::AddFunctionOverload(db, set);
|
654
645
|
}
|
655
646
|
};
|
656
647
|
|
657
|
-
void RegisterICUDatePartFunctions(
|
648
|
+
void RegisterICUDatePartFunctions(DatabaseInstance &db) {
|
658
649
|
// register the individual operators
|
659
650
|
|
660
651
|
// BIGINTs
|
661
|
-
ICUDatePart::AddUnaryPartCodeFunctions("era",
|
662
|
-
ICUDatePart::AddUnaryPartCodeFunctions("year",
|
663
|
-
ICUDatePart::AddUnaryPartCodeFunctions("month",
|
664
|
-
ICUDatePart::AddUnaryPartCodeFunctions("day",
|
665
|
-
ICUDatePart::AddUnaryPartCodeFunctions("decade",
|
666
|
-
ICUDatePart::AddUnaryPartCodeFunctions("century",
|
667
|
-
ICUDatePart::AddUnaryPartCodeFunctions("millennium",
|
668
|
-
ICUDatePart::AddUnaryPartCodeFunctions("microsecond",
|
669
|
-
ICUDatePart::AddUnaryPartCodeFunctions("millisecond",
|
670
|
-
ICUDatePart::AddUnaryPartCodeFunctions("second",
|
671
|
-
ICUDatePart::AddUnaryPartCodeFunctions("minute",
|
672
|
-
ICUDatePart::AddUnaryPartCodeFunctions("hour",
|
673
|
-
ICUDatePart::AddUnaryPartCodeFunctions("dayofweek",
|
674
|
-
ICUDatePart::AddUnaryPartCodeFunctions("isodow",
|
675
|
-
ICUDatePart::AddUnaryPartCodeFunctions("week",
|
676
|
-
ICUDatePart::AddUnaryPartCodeFunctions("dayofyear",
|
677
|
-
ICUDatePart::AddUnaryPartCodeFunctions("quarter",
|
678
|
-
ICUDatePart::AddUnaryPartCodeFunctions("isoyear",
|
679
|
-
ICUDatePart::AddUnaryPartCodeFunctions("timezone",
|
680
|
-
ICUDatePart::AddUnaryPartCodeFunctions("timezone_hour",
|
681
|
-
ICUDatePart::AddUnaryPartCodeFunctions("timezone_minute",
|
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",
|
685
|
-
ICUDatePart::AddUnaryPartCodeFunctions<double>("julian",
|
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",
|
679
|
+
ICUDatePart::AddUnaryPartCodeFunctions("yearweek", db); // Note this is ISO year and week
|
689
680
|
|
690
681
|
// register various aliases
|
691
|
-
ICUDatePart::AddUnaryPartCodeFunctions("dayofmonth",
|
692
|
-
ICUDatePart::AddUnaryPartCodeFunctions("weekday",
|
693
|
-
ICUDatePart::AddUnaryPartCodeFunctions("weekofyear",
|
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",
|
687
|
+
ICUDatePart::AddLastDayFunctions("last_day", db);
|
697
688
|
|
698
689
|
// register the dayname/monthname functions
|
699
|
-
ICUDatePart::AddMonthNameFunctions("monthname",
|
700
|
-
ICUDatePart::AddDayNameFunctions("dayname",
|
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",
|
704
|
-
ICUDatePart::AddDatePartFunctions("datepart",
|
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,
|
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,
|
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(
|
280
|
-
ICUCalendarSub::AddFunctions("date_sub",
|
281
|
-
ICUCalendarSub::AddFunctions("datesub",
|
274
|
+
void RegisterICUDateSubFunctions(DatabaseInstance &db) {
|
275
|
+
ICUCalendarSub::AddFunctions("date_sub", db);
|
276
|
+
ICUCalendarSub::AddFunctions("datesub", db);
|
282
277
|
|
283
|
-
ICUCalendarDiff::AddFunctions("date_diff",
|
284
|
-
ICUCalendarDiff::AddFunctions("datediff",
|
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,
|
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(
|
197
|
-
ICUDateTrunc::AddBinaryTimestampFunction("date_trunc",
|
198
|
-
ICUDateTrunc::AddBinaryTimestampFunction("datetrunc",
|
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(
|
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
|
-
|
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
|
-
|
199
|
-
catalog.AddFunction(context, generate_series_func_info);
|
197
|
+
ExtensionUtil::AddFunctionOverload(db, generate_series);
|
200
198
|
}
|
201
199
|
};
|
202
200
|
|
203
|
-
void RegisterICUListRangeFunctions(
|
204
|
-
ICUListRange::AddICUListRangeFunction(
|
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(
|
61
|
-
auto &config = DBConfig::GetConfig(
|
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,
|
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(
|
162
|
-
ICUMakeTimestampTZFunc::AddFunction("make_timestamptz",
|
163
|
-
ICUMakeDate::AddCasts(
|
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,
|
215
|
+
static void TailPatch(const string &name, DatabaseInstance &db, const vector<LogicalType> &types) {
|
215
216
|
// Find the old function
|
216
|
-
auto &
|
217
|
-
auto &
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
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
|
-
|
229
|
-
|
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,
|
235
|
+
static void AddBinaryTimestampFunction(const string &name, DatabaseInstance &db) {
|
235
236
|
vector<LogicalType> types {LogicalType::VARCHAR, LogicalType::VARCHAR};
|
236
|
-
TailPatch(name,
|
237
|
+
TailPatch(name, db, types);
|
237
238
|
|
238
239
|
types[1] = LogicalType::LIST(LogicalType::VARCHAR);
|
239
|
-
TailPatch(name,
|
240
|
+
TailPatch(name, db, types);
|
240
241
|
}
|
241
242
|
|
242
243
|
static bool CastFromVarchar(Vector &source, Vector &result, idx_t count, CastParameters ¶meters) {
|
@@ -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(
|
288
|
-
auto &config = DBConfig::GetConfig(
|
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,
|
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(
|
473
|
-
auto &config = DBConfig::GetConfig(
|
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(
|
481
|
-
ICUStrptime::AddBinaryTimestampFunction("strptime",
|
482
|
-
ICUStrptime::AddBinaryTimestampFunction("try_strptime",
|
478
|
+
void RegisterICUStrptimeFunctions(DatabaseInstance &db) {
|
479
|
+
ICUStrptime::AddBinaryTimestampFunction("strptime", db);
|
480
|
+
ICUStrptime::AddBinaryTimestampFunction("try_strptime", db);
|
483
481
|
|
484
|
-
ICUStrftime::AddBinaryTimestampFunction("strftime",
|
482
|
+
ICUStrftime::AddBinaryTimestampFunction("strftime", db);
|
485
483
|
|
486
484
|
// Add string casts
|
487
|
-
ICUStrptime::AddCasts(
|
488
|
-
ICUStrftime::AddCasts(
|
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(
|
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
|
-
|
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
|
-
|
186
|
-
catalog.AddFunction(context, generate_series_func_info);
|
183
|
+
ExtensionUtil::AddFunctionOverload(db, generate_series);
|
187
184
|
}
|
188
185
|
};
|
189
186
|
|
190
|
-
void RegisterICUTableRangeFunctions(
|
191
|
-
ICUTableRange::AddICUTableRangeFunction(
|
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(
|
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(
|
634
|
-
ICUTimeBucket::AddTimeBucketFunction(
|
631
|
+
void RegisterICUTimeBucketFunctions(DatabaseInstance &db) {
|
632
|
+
ICUTimeBucket::AddTimeBucketFunction(db);
|
635
633
|
}
|
636
634
|
|
637
635
|
} // namespace duckdb
|