19 #include <boost/algorithm/string/join.hpp>
29 const std::string&
name) {
38 const std::string&
name) {
48 const bool is_runtime) {
49 std::unordered_set<std::string> names;
51 for (
auto funcs : collections) {
52 for (
auto& pair : *funcs) {
55 names.insert(udf.
getName(
false));
63 const std::string&
name) {
64 std::vector<ExtensionFunction> ext_funcs = {};
67 for (
auto funcs : collections) {
68 const auto it = funcs->find(uname);
69 if (it == funcs->end()) {
72 auto ext_func_sigs = it->second;
73 std::copy(ext_func_sigs.begin(), ext_func_sigs.end(), std::back_inserter(ext_funcs));
79 const std::string&
name,
81 std::vector<ExtensionFunction> ext_funcs = {};
84 for (
auto funcs : collections) {
85 const auto it = funcs->find(uname);
86 if (it == funcs->end()) {
89 auto ext_func_sigs = it->second;
90 std::copy_if(ext_func_sigs.begin(),
92 std::back_inserter(ext_funcs),
93 [is_gpu](
auto sig) {
return (is_gpu ? sig.isGPU() : sig.isCPU()); });
99 const std::string&
name,
101 std::vector<ExtensionFunction> ext_funcs = {};
104 for (
auto funcs : collections) {
105 const auto it = funcs->find(uname);
106 if (it == funcs->end()) {
109 auto ext_func_sigs = it->second;
110 std::copy_if(ext_func_sigs.begin(),
112 std::back_inserter(ext_funcs),
113 [arity](
auto sig) {
return arity == sig.getInputArgs().size(); });
119 const std::string&
name,
122 std::vector<ExtensionFunction> ext_funcs = {};
125 for (
auto funcs : collections) {
126 const auto it = funcs->find(uname);
127 if (it == funcs->end()) {
130 auto ext_func_sigs = it->second;
131 std::copy_if(ext_func_sigs.begin(),
133 std::back_inserter(ext_funcs),
134 [arity, rtype](
auto sig) {
141 if (arity > sig.getInputArgs().size()) {
157 bool declare =
false) {
190 return (declare ?
"{i8*, i64, i8}*" :
"Array<i8>");
192 return (declare ?
"{i16*, i64, i8}*" :
"Array<i16>");
194 return (declare ?
"{i32*, i64, i8}*" :
"Array<i32>");
196 return (declare ?
"{i64*, i64, i8}*" :
"Array<i64>");
198 return (declare ?
"{float*, i64, i8}*" :
"Array<float>");
200 return (declare ?
"{double*, i64, i8}*" :
"Array<double>");
202 return (declare ?
"{i1*, i64, i8}*" :
"Array<i1>");
204 return (declare ?
"{i32*, i64, i8}*" :
"Array<TextEncodingDict>");
206 return (declare ?
"{i8*, i32, i32, i32, i32}*" :
"GeoPoint");
208 return (declare ?
"{i8*, i32, i32, i32, i32}*" :
"GeoMultiPoint");
210 return (declare ?
"{i8*, i32, i32, i32, i32}*" :
"GeoLineString");
212 return (declare ?
"{i8*, i32, i8*, i32, i32, i32, i32}*" :
"GeoMultiLineSting");
214 return (declare ?
"{i8*, i32, i8*, i32, i32, i32, i32}*" :
"GeoPolygon");
216 return (declare ?
"{i8*, i32, i8*, i32, i8*, i32, i32, i32, i32}*"
217 :
"GeoMultiPolygon");
221 return (declare ? (byval ?
"{i8*, i64}" :
"i8*") :
"Column<i8>");
223 return (declare ? (byval ?
"{i16*, i64}" :
"i8*") :
"Column<i16>");
225 return (declare ? (byval ?
"{i32*, i64}" :
"i8*") :
"Column<i32>");
227 return (declare ? (byval ?
"{i64*, i64}" :
"i8*") :
"Column<i64>");
229 return (declare ? (byval ?
"{float*, i64}" :
"i8*") :
"Column<float>");
231 return (declare ? (byval ?
"{double*, i64}" :
"i8*") :
"Column<double>");
233 return (declare ? (byval ?
"{i8*, i64}" :
"i8*") :
"Column<bool>");
235 return (declare ? (byval ?
"{i32*, i64}" :
"i8*") :
"Column<TextEncodingDict>");
237 return (declare ? (byval ?
"{i64*, i64}" :
"i8*") :
"Column<Timestamp>");
239 return (declare ? (byval ?
"{i8*, i64}" :
"i8*") :
"TextEncodingNone");
241 return (declare ?
"{ i32 }" :
"TextEncodingDict");
243 return (declare ?
"{ i64 }" :
"Timestamp");
245 return (declare ?
"{i8**, i64, i64}*" :
"ColumnList<i8>");
247 return (declare ?
"{i8**, i64, i64}*" :
"ColumnList<i16>");
249 return (declare ?
"{i8**, i64, i64}*" :
"ColumnList<i32>");
251 return (declare ?
"{i8**, i64, i64}*" :
"ColumnList<i64>");
253 return (declare ?
"{i8**, i64, i64}*" :
"ColumnList<float>");
255 return (declare ?
"{i8**, i64, i64}*" :
"ColumnList<double>");
257 return (declare ?
"{i8**, i64, i64}*" :
"ColumnList<bool>");
259 return (declare ?
"{i8**, i64, i64}*" :
"ColumnList<TextEncodingDict>");
261 return (declare ?
"{i8*, i64}*" :
"Column<Array<i8>>");
263 return (declare ?
"{i8*, i64}*" :
"Column<Array<i16>>");
265 return (declare ?
"{i8*, i64}*" :
"Column<Array<i32>>");
267 return (declare ?
"{i8*, i64}*" :
"Column<Array<i64>>");
269 return (declare ?
"{i8*, i64}*" :
"Column<Array<float>>");
271 return (declare ?
"{i8*, i64}*" :
"Column<Array<double>>");
273 return (declare ?
"{i8*, i64}*" :
"Column<Array<bool>>");
275 return (declare ?
"{i8*, i64}" :
"Column<Array<TextEncodingDict>>");
277 return (declare ?
"{i8**, i64, i64}*" :
"ColumnListArray<i8>");
279 return (declare ?
"{i8**, i64, i64}*" :
"ColumnListArray<i16>");
281 return (declare ?
"{i8**, i64, i64}*" :
"ColumnListArray<i32>");
283 return (declare ?
"{i8**, i64, i64}*" :
"ColumnListArray<i64>");
285 return (declare ?
"{i8**, i64, i64}*" :
"ColumnListArray<float>");
287 return (declare ?
"{i8**, i64, i64}*" :
"ColumnListArray<double>");
289 return (declare ?
"{i8**, i64, i64}*" :
"ColumnListArray<bool>");
291 return (declare ?
"{i8**, i64, i64}" :
"ColumnList<Array<TextEncodingDict>>");
293 return (declare ?
"{ i64 }" :
"DayTimeInterval");
295 return (declare ?
"{ i64 }" :
"YearMonthTimeInterval");
297 return (declare ?
"{i8*, i64}*" :
"Column<GeoPoint>");
299 return (declare ?
"{i8*, i64}*" :
"Column<GeoLineString>");
301 return (declare ?
"{i8*, i64}*" :
"Column<GeoPolygon>");
303 return (declare ?
"{i8*, i64}*" :
"Column<GeoMultiPoint>");
305 return (declare ?
"{i8*, i64}*" :
"Column<GeoMultiLineString>");
307 return (declare ?
"{i8*, i64}*" :
"Column<GeoMultiPolygon>");
309 return (declare ?
"{i8*, i64, i64}*" :
"ColumnList<GeoPoint>");
311 return (declare ?
"{i8*, i64, i64}*" :
"ColumnList<GeoLineString>");
313 return (declare ?
"{i8*, i64, i64}*" :
"ColumnList<GeoPolygon>");
315 return (declare ?
"{i8*, i64, i64}*" :
"ColumnList<GeoMultiPoint>");
317 return (declare ?
"{i8*, i64, i64}*" :
"ColumnList<GeoMultiLineString>");
319 return (declare ?
"{i8*, i64, i64}*" :
"ColumnList<GeoMultiPolygon>");
321 return (declare ?
"{i8*, i64}*" :
"Column<TextEncodingNone>");
323 return (declare ?
"{i8*, i64}*" :
"Column<Array<TextEncodingNone>>");
325 return (declare ?
"{i8*, i64, i64}*" :
"ColumnList<TextEncodingNone>");
327 return (declare ?
"{i8*, i64, i64}*" :
"ColumnList<Array<TextEncodingNone>>");
336 const auto idx = str.find(
"__");
337 if (idx == std::string::npos) {
340 CHECK_GT(idx, std::string::size_type(0));
341 return str.substr(0, idx);
355 #define EXTARGTYPECASE(EXTARGTYPE, ELEMTYPE, ENCODING, ARRAYENCODING) \
356 case ExtArgumentType::EXTARGTYPE: \
358 c = kENCODING_##ENCODING; \
360 case ExtArgumentType::Array##EXTARGTYPE: \
362 c = kENCODING_##ENCODING; \
363 subtype = ELEMTYPE; \
366 case ExtArgumentType::Column##EXTARGTYPE: \
368 c = kENCODING_##ENCODING; \
369 subtype = ELEMTYPE; \
371 case ExtArgumentType::ColumnList##EXTARGTYPE: \
372 type = kCOLUMN_LIST; \
373 c = kENCODING_##ENCODING; \
374 subtype = ELEMTYPE; \
376 case ExtArgumentType::ColumnArray##EXTARGTYPE: \
378 subtype = ELEMTYPE; \
379 c = kENCODING_##ARRAYENCODING; \
381 case ExtArgumentType::ColumnListArray##EXTARGTYPE: \
382 type = kCOLUMN_LIST; \
383 subtype = ELEMTYPE; \
384 c = kENCODING_##ARRAYENCODING; \
387 #define EXTARGGEOTYPECASE(GEOTYPE, KTYPE) \
388 case ExtArgumentType::Geo##GEOTYPE: \
390 subtype = kGEOMETRY; \
392 case ExtArgumentType::ColumnGeo##GEOTYPE: \
396 case ExtArgumentType::ColumnListGeo##GEOTYPE: \
397 type = kCOLUMN_LIST; \
401 switch (ext_arg_type) {
437 <<
"` cannot be converted to SQLTypes.";
444 const std::vector<ExtensionFunction>& ext_funcs,
447 for (
auto sig : ext_funcs) {
448 r += tab + sig.toString() +
"\n";
454 const std::vector<SQLTypeInfo>& arg_types) {
456 for (
auto sig = arg_types.begin(); sig != arg_types.end();) {
457 r += sig->get_type_name();
459 if (sig != arg_types.end()) {
467 const std::vector<ExtArgumentType>& sig_types) {
469 for (
auto t = sig_types.begin(); t != sig_types.end();) {
472 if (t != sig_types.end()) {
480 const std::vector<ExtArgumentType>& sig_types) {
482 for (
auto t = sig_types.begin(); t != sig_types.end();) {
485 if (t != sig_types.end()) {
527 return "ARRAY<TINYINT>";
529 return "ARRAY<SMALLINT>";
533 return "ARRAY<BIGINT>";
535 return "ARRAY<FLOAT>";
537 return "ARRAY<DOUBLE>";
539 return "ARRAY<BOOLEAN>";
541 return "ARRAY<TEXT ENCODING DICT>";
543 return "ARRAY<TEXT ENCODING NONE>";
545 return "COLUMN<TINYINT>";
547 return "COLUMN<SMALLINT>";
549 return "COLUMN<INT>";
551 return "COLUMN<BIGINT>";
553 return "COLUMN<FLOAT>";
555 return "COLUMN<DOUBLE>";
557 return "COLUMN<BOOLEAN>";
559 return "COLUMN<TEXT ENCODING DICT>";
561 return "COLUMN<TEXT ENCODING NONE>";
563 return "COLUMN<TIMESTAMP(9)>";
573 return "MULTILINESTRING";
577 return "MULTIPOLYGON";
581 return "TEXT ENCODING NONE";
583 return "TEXT ENCODING DICT";
585 return "TIMESTAMP(9)";
587 return "COLUMNLIST<TINYINT>";
589 return "COLUMNLIST<SMALLINT>";
591 return "COLUMNLIST<INT>";
593 return "COLUMNLIST<BIGINT>";
595 return "COLUMNLIST<FLOAT>";
597 return "COLUMNLIST<DOUBLE>";
599 return "COLUMNLIST<BOOLEAN>";
601 return "COLUMNLIST<TEXT ENCODING DICT>";
603 return "COLUMNLIST<TEXT ENCODING NONE>";
605 return "COLUMN<ARRAY<TINYINT>>";
607 return "COLUMN<ARRAY<SMALLINT>>";
609 return "COLUMN<ARRAY<INT>>";
611 return "COLUMN<ARRAY<BIGINT>>";
613 return "COLUMN<ARRAY<FLOAT>>";
615 return "COLUMN<ARRAY<DOUBLE>>";
617 return "COLUMN<ARRAY<BOOLEAN>>";
619 return "COLUMN<ARRAY<TEXT ENCODING DICT>>";
621 return "COLUMN<ARRAY<TEXT ENCODING NONE>>";
623 return "COLUMNLIST<ARRAY<TINYINT>>";
625 return "COLUMNLIST<ARRAY<SMALLINT>>";
627 return "COLUMNLIST<ARRAY<INT>>";
629 return "COLUMNLIST<ARRAY<BIGINT>>";
631 return "COLUMNLIST<ARRAY<FLOAT>>";
633 return "COLUMNLIST<ARRAY<DOUBLE>>";
635 return "COLUMNLIST<ARRAY<BOOLEAN>>";
637 return "COLUMNLIST<ARRAY<TEXT ENCODING DICT>>";
639 return "COLUMNLIST<ARRAY<TEXT ENCODING NONE>>";
641 return "DAY TIME INTERVAL";
643 return "YEAR MONTH INTERVAL";
645 return "COLUMN<GEOPOINT>";
647 return "COLUMN<GEOLINESTRING>";
649 return "COLUMN<GEOPOLYGON>";
651 return "COLUMN<GEOMULTIPOINT>";
653 return "COLUMN<GEOMULTILINESTRING>";
655 return "COLUMN<GEOMULTIPOLYGON>";
657 return "COLUMNLIST<GEOPOINT>";
659 return "COLUMNLIST<GEOLINESTRING>";
661 return "COLUMNLIST<GEOPOLYGON>";
663 return "COLUMNLIST<GEOMULTIPOINT>";
665 return "COLUMNLIST<GEOMULTILINESTRING>";
667 return "COLUMNLIST<GEOMULTIPOLYGON>";
669 UNREACHABLE() <<
" sig_type=" <<
static_cast<int>(sig_type);
680 auto mgr_annotation = func_annotations.find(
"uses_manager");
681 if (mgr_annotation != func_annotations.end()) {
682 return boost::algorithm::to_lower_copy(mgr_annotation->second) ==
"true";
710 const std::unordered_set<std::string>& udf_decls,
712 std::vector<std::string> declarations;
714 const std::vector<ExtensionFunction>& ext_funcs = kv.second;
715 CHECK(!ext_funcs.empty());
716 for (
const auto& ext_func : ext_funcs) {
719 if (!udf_decls.empty() && udf_decls.find(ext_func.getName()) != udf_decls.end()) {
723 std::string decl_prefix;
724 std::vector<std::string> arg_strs;
727 decl_prefix =
"declare void @" + ext_func.getName();
728 arg_strs.emplace_back(
734 " @" + ext_func.getName();
739 if (ext_func.usesManager()) {
740 arg_strs.emplace_back(
"i8*");
743 for (
const auto arg : ext_func.getInputArgs()) {
746 declarations.emplace_back(decl_prefix +
"(" +
752 if (kv.second.isRuntime() || kv.second.useDefaultSizer()) {
757 if (!((is_gpu && kv.second.isGPU()) || (!is_gpu && kv.second.isCPU()))) {
760 std::string decl_prefix{
764 std::vector<std::string> arg_strs;
765 for (
const auto arg : kv.second.getArgs(
true)) {
778 if (type_name ==
"bool" || type_name ==
"i1") {
781 if (type_name ==
"i8") {
784 if (type_name ==
"i16") {
787 if (type_name ==
"i32") {
790 if (type_name ==
"i64") {
793 if (type_name ==
"float") {
796 if (type_name ==
"double") {
799 if (type_name ==
"void") {
802 if (type_name ==
"i8*") {
805 if (type_name ==
"i16*") {
808 if (type_name ==
"i32*") {
811 if (type_name ==
"i64*") {
814 if (type_name ==
"float*") {
817 if (type_name ==
"double*") {
820 if (type_name ==
"i1*" || type_name ==
"bool*") {
823 if (type_name ==
"Array<i8>") {
826 if (type_name ==
"Array<i16>") {
829 if (type_name ==
"Array<i32>") {
832 if (type_name ==
"Array<i64>") {
835 if (type_name ==
"Array<float>") {
838 if (type_name ==
"Array<double>") {
841 if (type_name ==
"Array<bool>" || type_name ==
"Array<i1>") {
844 if (type_name ==
"Array<TextEncodingDict>") {
847 if (type_name ==
"Array<TextEncodingNone>") {
850 if (type_name ==
"GeoPoint") {
853 if (type_name ==
"GeoMultiPoint") {
856 if (type_name ==
"GeoLineString") {
859 if (type_name ==
"GeoMultiLineString") {
862 if (type_name ==
"GeoPolygon") {
865 if (type_name ==
"GeoMultiPolygon") {
868 if (type_name ==
"cursor") {
871 if (type_name ==
"Column<i8>") {
874 if (type_name ==
"Column<i16>") {
877 if (type_name ==
"Column<i32>") {
880 if (type_name ==
"Column<i64>") {
883 if (type_name ==
"Column<float>") {
886 if (type_name ==
"Column<double>") {
889 if (type_name ==
"Column<bool>") {
892 if (type_name ==
"Column<TextEncodingDict>") {
895 if (type_name ==
"Column<Timestamp>") {
898 if (type_name ==
"TextEncodingNone") {
901 if (type_name ==
"TextEncodingDict") {
904 if (type_name ==
"timestamp") {
907 if (type_name ==
"ColumnList<i8>") {
910 if (type_name ==
"ColumnList<i16>") {
913 if (type_name ==
"ColumnList<i32>") {
916 if (type_name ==
"ColumnList<i64>") {
919 if (type_name ==
"ColumnList<float>") {
922 if (type_name ==
"ColumnList<double>") {
925 if (type_name ==
"ColumnList<bool>") {
928 if (type_name ==
"ColumnList<TextEncodingDict>") {
931 if (type_name ==
"Column<Array<i8>>") {
934 if (type_name ==
"Column<Array<i16>>") {
937 if (type_name ==
"Column<Array<i32>>") {
940 if (type_name ==
"Column<Array<i64>>") {
943 if (type_name ==
"Column<Array<float>>") {
946 if (type_name ==
"Column<Array<double>>") {
949 if (type_name ==
"Column<Array<bool>>") {
952 if (type_name ==
"Column<Array<TextEncodingDict>>") {
955 if (type_name ==
"ColumnList<Array<i8>>") {
958 if (type_name ==
"ColumnList<Array<i16>>") {
961 if (type_name ==
"ColumnList<Array<i32>>") {
964 if (type_name ==
"ColumnList<Array<i64>>") {
967 if (type_name ==
"ColumnList<Array<float>>") {
970 if (type_name ==
"ColumnList<Array<double>>") {
973 if (type_name ==
"ColumnList<Array<bool>>") {
976 if (type_name ==
"ColumnList<Array<TextEncodingDict>>") {
979 if (type_name ==
"DayTimeInterval") {
982 if (type_name ==
"YearMonthTimeInterval") {
985 if (type_name ==
"Column<GeoPoint>") {
988 if (type_name ==
"Column<GeoLineString>") {
991 if (type_name ==
"Column<GeoPolygon>") {
994 if (type_name ==
"Column<GeoMultiPoint>") {
997 if (type_name ==
"Column<GeoMultiLineString>") {
1000 if (type_name ==
"Column<GeoMultiPolygon>") {
1003 if (type_name ==
"ColumnList<GeoPoint>") {
1006 if (type_name ==
"ColumnList<GeoLineString>") {
1009 if (type_name ==
"ColumnList<GeoPolygon>") {
1012 if (type_name ==
"ColumnList<GeoMultiPoint>") {
1015 if (type_name ==
"ColumnList<GeoMultiLineString>") {
1018 if (type_name ==
"ColumnList<GeoMultiPolygon>") {
1027 using SignatureMap = std::unordered_map<std::string, std::vector<ExtensionFunction>>;
1030 const std::string& json_func_sigs,
1031 const bool is_runtime) {
1032 rapidjson::Document func_sigs;
1033 func_sigs.Parse(json_func_sigs.c_str());
1034 CHECK(func_sigs.IsArray());
1035 for (
auto func_sigs_it = func_sigs.Begin(); func_sigs_it != func_sigs.End();
1037 CHECK(func_sigs_it->IsObject());
1040 std::vector<ExtArgumentType>
args;
1041 const auto& args_serialized =
field(*func_sigs_it,
"args");
1042 CHECK(args_serialized.IsArray());
1043 for (
auto args_serialized_it = args_serialized.Begin();
1044 args_serialized_it != args_serialized.End();
1045 ++args_serialized_it) {
1049 std::vector<std::map<std::string, std::string>> annotations;
1050 const auto& anns =
field(*func_sigs_it,
"annotations");
1051 CHECK(anns.IsArray());
1052 static const std::map<std::string, std::string> map_empty = {};
1053 for (
auto obj = anns.Begin(); obj != anns.End(); ++obj) {
1054 CHECK(obj->IsObject());
1055 if (obj->ObjectEmpty()) {
1056 annotations.push_back(map_empty);
1058 std::map<std::string, std::string> m;
1059 for (
auto kv = obj->MemberBegin(); kv != obj->MemberEnd(); ++kv) {
1060 m[kv->name.GetString()] = kv->value.GetString();
1062 annotations.push_back(m);
1066 name, args, ret, annotations, is_runtime);
1091 if (!json_func_sigs.empty()) {
1101 if (!json_func_sigs.empty()) {
1106 std::unordered_map<std::string, std::vector<ExtensionFunction>>
1109 std::unordered_map<std::string, std::vector<ExtensionFunction>>
1112 std::unordered_map<std::string, std::vector<ExtensionFunction>>
static void addUdfs(const std::string &json_func_sigs)
static void addCommon(std::unordered_map< std::string, std::vector< ExtensionFunction >> &sigs, const std::string &json_func_sigs, const bool is_runtime)
std::string drop_suffix(const std::string &str)
static std::vector< ExtensionFunction > get_ext_funcs(const std::string &name)
static std::unordered_map< std::string, std::vector< ExtensionFunction > > udf_functions_
static std::vector< ExtensionFunction > * get(const std::string &name)
static void clearRTUdfs()
std::string toSignature() const
const std::string json_str(const rapidjson::Value &obj) noexcept
static std::unordered_map< std::string, std::vector< ExtensionFunction > > rt_udf_functions_
const std::vector< ExtArgumentType > args_
static void add(const std::string &json_func_sigs)
std::unordered_map< std::string, std::vector< ExtensionFunction >> SignatureMap
const std::string getName(bool keep_suffix=true) const
HOST DEVICE SQLTypes get_type() const
std::string toStringSQL() const
std::string toString() const
static std::unordered_map< std::string, std::vector< ExtensionFunction > > functions_
const rapidjson::Value & field(const rapidjson::Value &obj, const char field[]) noexcept
Supported runtime functions management and retrieval.
static std::vector< ExtensionFunction > * get_udf(const std::string &name)
#define EXTARGTYPECASE(EXTARGTYPE, ELEMTYPE, ENCODING, ARRAYENCODING)
DEVICE auto copy(ARGS &&...args)
ExtArgumentType deserialize_type(const std::string &type_name)
bool is_ext_arg_type_array(const ExtArgumentType ext_arg_type)
static std::unordered_set< std::string > get_udfs_name(const bool is_runtime)
Checked json field retrieval.
std::string toString(const Executor::ExtModuleKinds &kind)
Argument type based extension function binding.
#define EXTARGGEOTYPECASE(GEOTYPE, KTYPE)
std::string serialize_type(const ExtArgumentType type, bool byval=true, bool declare=false)
const std::vector< std::map< std::string, std::string > > annotations_
const ExtArgumentType ret_
static std::string toString(const std::vector< ExtensionFunction > &ext_funcs, std::string tab="")
static std::unordered_map< std::string, TableFunction > functions_
constexpr auto type_name() noexcept
static std::vector< std::string > getLLVMDeclarations(const std::unordered_set< std::string > &udf_decls, const bool is_gpu=false)
SQLTypeInfo ext_arg_type_to_type_info(const ExtArgumentType ext_arg_type)
static std::string toStringSQL(const std::vector< ExtArgumentType > &sig_types)
static void addRTUdfs(const std::string &json_func_sigs)