mkql_builtins_compare.h 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. #pragma once
  2. #include "mkql_builtins_impl.h" // Y_IGNORE // Y_IGNORE
  3. namespace NKikimr {
  4. namespace NMiniKQL {
  5. template <typename TLeft, typename TRight, class TImpl>
  6. struct TCompareArithmeticBinary : public TArithmeticConstraintsBinary<TLeft, TRight, bool> {
  7. static NUdf::TUnboxedValuePod Execute(const NUdf::TUnboxedValuePod& left, const NUdf::TUnboxedValuePod& right) {
  8. return NUdf::TUnboxedValuePod(TImpl::Do(left.template Get<TLeft>(), right.template Get<TRight>()));
  9. }
  10. static void DoPtr(
  11. const typename TPrimitiveDataType<TLeft>::TLayout* left,
  12. const typename TPrimitiveDataType<TRight>::TLayout* right,
  13. typename TPrimitiveDataType<bool>::TLayout* res) {
  14. *res = TImpl::Do(*left, *right);
  15. }
  16. #ifndef MKQL_DISABLE_CODEGEN
  17. static Value* Generate(Value* left, Value* right, const TCodegenContext& ctx, BasicBlock*& block)
  18. {
  19. auto& context = ctx.Codegen.GetContext();
  20. const auto lhs = GetterFor<TLeft>(left, context, block);
  21. const auto rhs = GetterFor<TRight>(right, context, block);
  22. const auto res = TImpl::Gen(lhs, rhs, ctx, block);
  23. const auto wide = MakeBoolean(res, context, block);
  24. return wide;
  25. }
  26. #endif
  27. };
  28. template <typename TLeft, typename TRight, class TImpl>
  29. struct TCompareArithmeticBinaryWithTimezone : public TArithmeticConstraintsBinary<TLeft, TRight, bool> {
  30. static_assert(std::is_same<TLeft, TRight>::value, "Must be same type.");
  31. static NUdf::TUnboxedValuePod Execute(const NUdf::TUnboxedValuePod& left, const NUdf::TUnboxedValuePod& right) {
  32. const auto l = left.template Get<TLeft>();
  33. const auto r = right.template Get<TRight>();
  34. return NUdf::TUnboxedValuePod(l == r ? TImpl::DoTz(left.GetTimezoneId(), right.GetTimezoneId()) : TImpl::Do(left.template Get<TLeft>(), right.template Get<TRight>()));
  35. }
  36. #ifndef MKQL_DISABLE_CODEGEN
  37. static Value* Generate(Value* left, Value* right, const TCodegenContext& ctx, BasicBlock*& block)
  38. {
  39. auto& context = ctx.Codegen.GetContext();
  40. const auto lhs = GetterFor<TLeft>(left, context, block);
  41. const auto rhs = GetterFor<TRight>(right, context, block);
  42. const auto equals = CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, lhs, rhs, "equals", block);
  43. const auto ltz = GetterForTimezone(context, left, block);
  44. const auto rtz = GetterForTimezone(context, right, block);
  45. const auto result = SelectInst::Create(equals, TImpl::GenTz(ltz, rtz, ctx, block), TImpl::Gen(lhs, rhs, ctx, block), "result", block);
  46. const auto wide = MakeBoolean(result, context, block);
  47. return wide;
  48. }
  49. #endif
  50. };
  51. template <typename TType, class TImpl>
  52. struct TSelectArithmeticBinaryCopyTimezone : public TArithmeticConstraintsBinary<TType, TType, bool> {
  53. static NUdf::TUnboxedValuePod Execute(const NUdf::TUnboxedValuePod& left, const NUdf::TUnboxedValuePod& right) {
  54. return TImpl::Do(left.template Get<TType>(), right.template Get<TType>()) ? left : right;
  55. }
  56. #ifndef MKQL_DISABLE_CODEGEN
  57. static Value* Generate(Value* left, Value* right, const TCodegenContext& ctx, BasicBlock*& block)
  58. {
  59. auto& context = ctx.Codegen.GetContext();
  60. const auto lhs = GetterFor<TType>(left, context, block);
  61. const auto rhs = GetterFor<TType>(right, context, block);
  62. const auto result = SelectInst::Create(TImpl::Gen(lhs, rhs, ctx, block), left, right, "result", block);
  63. return result;
  64. }
  65. #endif
  66. };
  67. template <typename TType, class TImpl>
  68. struct TSelectArithmeticBinaryWithTimezone : public TArithmeticConstraintsBinary<TType, TType, bool> {
  69. static NUdf::TUnboxedValuePod Execute(const NUdf::TUnboxedValuePod& left, const NUdf::TUnboxedValuePod& right) {
  70. const auto l = left.template Get<TType>();
  71. const auto r = right.template Get<TType>();
  72. const bool choise = l == r ? TImpl::DoTz(left.GetTimezoneId(), right.GetTimezoneId()) : TImpl::Do(l, r);
  73. return choise ? left : right;
  74. }
  75. #ifndef MKQL_DISABLE_CODEGEN
  76. static Value* Generate(Value* left, Value* right, const TCodegenContext& ctx, BasicBlock*& block)
  77. {
  78. auto& context = ctx.Codegen.GetContext();
  79. const auto lhs = GetterFor<TType>(left, context, block);
  80. const auto rhs = GetterFor<TType>(right, context, block);
  81. const auto equals = CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, lhs, rhs, "equals", block);
  82. const auto ltz = GetterForTimezone(context, left, block);
  83. const auto rtz = GetterForTimezone(context, right, block);
  84. const auto choise = SelectInst::Create(equals, TImpl::GenTz(ltz, rtz, ctx, block), TImpl::Gen(lhs, rhs, ctx, block), "choise", block);
  85. const auto result = SelectInst::Create(choise, left, right, "result", block);
  86. return result;
  87. }
  88. #endif
  89. };
  90. template<NUdf::EDataSlot Slot>
  91. int CompareCustoms(NUdf::TUnboxedValuePod lhs, NUdf::TUnboxedValuePod rhs) {
  92. const TStringBuf lhsBuf = lhs.AsStringRef();
  93. const TStringBuf rhsBuf = rhs.AsStringRef();
  94. return lhsBuf.compare(rhsBuf);
  95. }
  96. template<NUdf::EDataSlot Slot>
  97. int CompareCustomsWithCleanup(NUdf::TUnboxedValuePod left, NUdf::TUnboxedValuePod right) {
  98. const auto c = CompareCustoms<Slot>(left, right);
  99. left.DeleteUnreferenced();
  100. right.DeleteUnreferenced();
  101. return c;
  102. }
  103. template <typename TInput1, typename TInput2, bool IsLeftOptional, bool IsRightOptional, bool IsResultOptional>
  104. struct TCompareArgsOpt {
  105. static const TFunctionParamMetadata Value[4];
  106. };
  107. template <typename TInput1, typename TInput2, bool IsLeftOptional, bool IsRightOptional, bool IsResultOptional>
  108. const TFunctionParamMetadata TCompareArgsOpt<TInput1, TInput2, IsLeftOptional, IsRightOptional, IsResultOptional>::Value[4] = {
  109. { NUdf::TDataType<bool>::Id, IsResultOptional ? TFunctionParamMetadata::FlagIsNullable : 0 },
  110. { TInput1::Id, IsLeftOptional ? TFunctionParamMetadata::FlagIsNullable : 0 },
  111. { TInput2::Id, IsRightOptional ? TFunctionParamMetadata::FlagIsNullable : 0 },
  112. { 0, 0 }
  113. };
  114. template <
  115. typename TInput1, typename TInput2,
  116. template<typename, typename, bool> class TFunc,
  117. template<typename, typename, bool, bool, bool> class TArgs
  118. >
  119. void RegisterCompareOpt(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  120. RegisterFunctionImpl<TFunc<typename TInput1::TLayout, typename TInput2::TLayout, false>, TArgs<TInput1, TInput2, false, false, false>, TBinaryWrap<false, false>>(registry, name);
  121. RegisterFunctionImpl<TFunc<typename TInput1::TLayout, typename TInput2::TLayout, false>, TArgs<TInput1, TInput2, false, true, true>, TBinaryWrap<false, true>>(registry, name);
  122. RegisterFunctionImpl<TFunc<typename TInput1::TLayout, typename TInput2::TLayout, false>, TArgs<TInput1, TInput2, true, false, true>, TBinaryWrap<true, false>>(registry, name);
  123. RegisterFunctionImpl<TFunc<typename TInput1::TLayout, typename TInput2::TLayout, false>, TArgs<TInput1, TInput2, true, true, true>, TBinaryWrap<true, true>>(registry, name);
  124. }
  125. template <
  126. typename TInput,
  127. template<typename, typename, bool> class TFunc,
  128. template<typename, typename, bool, bool, bool> class TArgs
  129. >
  130. void RegisterAggrCompareOpt(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  131. RegisterFunctionImpl<TFunc<typename TInput::TLayout, typename TInput::TLayout, true>, TArgs<TInput, TInput, false, false, false>, TBinaryWrap<false, false>>(registry, name);
  132. RegisterFunctionImpl<TFunc<typename TInput::TLayout, typename TInput::TLayout, true>, TArgs<TInput, TInput, true, true, false>, TAggrCompareWrap>(registry, name);
  133. }
  134. template <
  135. typename TType1, typename TType2,
  136. class TFunc,
  137. template<typename, typename, bool, bool, bool> class TArgs
  138. >
  139. void RegisterCompareCustomOpt(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  140. RegisterFunctionImpl<TFunc, TArgs<TType1, TType2, false, false, false>, TBinaryWrap<false, false>>(registry, name);
  141. RegisterFunctionImpl<TFunc, TArgs<TType1, TType2, false, true, true>, TBinaryWrap<false, true>>(registry, name);
  142. RegisterFunctionImpl<TFunc, TArgs<TType1, TType2, true, false, true>, TBinaryWrap<true, false>>(registry, name);
  143. RegisterFunctionImpl<TFunc, TArgs<TType1, TType2, true, true, true>, TBinaryWrap<true, true>>(registry, name);
  144. }
  145. template <
  146. typename TType1, typename TType2,
  147. template<typename, typename, bool> class TFunc,
  148. template<typename, typename, bool, bool, bool> class TArgs
  149. >
  150. void RegisterComparePolyOpt(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  151. RegisterFunctionImpl<TFunc<TType1, TType2, false>, TArgs<TType1, TType2, false, false, false>, TBinaryWrap<false, false>>(registry, name);
  152. RegisterFunctionImpl<TFunc<TType1, TType2, false>, TArgs<TType1, TType2, false, true, true>, TBinaryWrap<false, true>>(registry, name);
  153. RegisterFunctionImpl<TFunc<TType1, TType2, false>, TArgs<TType1, TType2, true, false, true>, TBinaryWrap<true, false>>(registry, name);
  154. RegisterFunctionImpl<TFunc<TType1, TType2, false>, TArgs<TType1, TType2, true, true, true>, TBinaryWrap<true, true>>(registry, name);
  155. }
  156. template <
  157. typename TType,
  158. class TFunc,
  159. template<typename, typename, bool, bool, bool> class TArgs
  160. >
  161. void RegisterAggrCompareCustomOpt(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  162. RegisterFunctionImpl<TFunc, TArgs<TType, TType, false, false, false>, TBinaryWrap<false, false>>(registry, name);
  163. RegisterFunctionImpl<TFunc, TArgs<TType, TType, true, true, false>, TAggrCompareWrap>(registry, name);
  164. }
  165. template <
  166. typename TInput,
  167. template<typename, typename, bool> class TFunc,
  168. template<typename, typename, bool, bool, bool> class TArgs
  169. >
  170. void RegisterAggrComparePolyOpt(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  171. RegisterFunctionImpl<TFunc<TInput, TInput, true>, TArgs<TInput, TInput, false, false, false>, TBinaryWrap<false, false>>(registry, name);
  172. RegisterFunctionImpl<TFunc<TInput, TInput, true>, TArgs<TInput, TInput, true, true, false>, TAggrCompareWrap>(registry, name);
  173. }
  174. template <
  175. template<typename, typename, bool> class TFunc,
  176. template<typename, typename, bool, bool, bool> class TArgs
  177. >
  178. void RegisterCompareUnsigned(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  179. RegisterCompareOpt<NUdf::TDataType<ui8>, NUdf::TDataType<ui8>, TFunc, TArgs>(registry, name);
  180. RegisterCompareOpt<NUdf::TDataType<ui8>, NUdf::TDataType<ui16>, TFunc, TArgs>(registry, name);
  181. RegisterCompareOpt<NUdf::TDataType<ui8>, NUdf::TDataType<ui32>, TFunc, TArgs>(registry, name);
  182. RegisterCompareOpt<NUdf::TDataType<ui8>, NUdf::TDataType<ui64>, TFunc, TArgs>(registry, name);
  183. RegisterCompareOpt<NUdf::TDataType<ui16>, NUdf::TDataType<ui8>, TFunc, TArgs>(registry, name);
  184. RegisterCompareOpt<NUdf::TDataType<ui16>, NUdf::TDataType<ui16>, TFunc, TArgs>(registry, name);
  185. RegisterCompareOpt<NUdf::TDataType<ui16>, NUdf::TDataType<ui32>, TFunc, TArgs>(registry, name);
  186. RegisterCompareOpt<NUdf::TDataType<ui16>, NUdf::TDataType<ui64>, TFunc, TArgs>(registry, name);
  187. RegisterCompareOpt<NUdf::TDataType<ui32>, NUdf::TDataType<ui8>, TFunc, TArgs>(registry, name);
  188. RegisterCompareOpt<NUdf::TDataType<ui32>, NUdf::TDataType<ui16>, TFunc, TArgs>(registry, name);
  189. RegisterCompareOpt<NUdf::TDataType<ui32>, NUdf::TDataType<ui32>, TFunc, TArgs>(registry, name);
  190. RegisterCompareOpt<NUdf::TDataType<ui32>, NUdf::TDataType<ui64>, TFunc, TArgs>(registry, name);
  191. RegisterCompareOpt<NUdf::TDataType<ui64>, NUdf::TDataType<ui8>, TFunc, TArgs>(registry, name);
  192. RegisterCompareOpt<NUdf::TDataType<ui64>, NUdf::TDataType<ui16>, TFunc, TArgs>(registry, name);
  193. RegisterCompareOpt<NUdf::TDataType<ui64>, NUdf::TDataType<ui32>, TFunc, TArgs>(registry, name);
  194. RegisterCompareOpt<NUdf::TDataType<ui64>, NUdf::TDataType<ui64>, TFunc, TArgs>(registry, name);
  195. }
  196. template <
  197. template<typename, typename, bool> class TFunc,
  198. template<typename, typename, bool, bool, bool> class TArgs
  199. >
  200. void RegisterCompareSigned(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  201. RegisterCompareOpt<NUdf::TDataType<i8>, NUdf::TDataType<i8>, TFunc, TArgs>(registry, name);
  202. RegisterCompareOpt<NUdf::TDataType<i8>, NUdf::TDataType<i16>, TFunc, TArgs>(registry, name);
  203. RegisterCompareOpt<NUdf::TDataType<i8>, NUdf::TDataType<i32>, TFunc, TArgs>(registry, name);
  204. RegisterCompareOpt<NUdf::TDataType<i8>, NUdf::TDataType<i64>, TFunc, TArgs>(registry, name);
  205. RegisterCompareOpt<NUdf::TDataType<i16>, NUdf::TDataType<i8>, TFunc, TArgs>(registry, name);
  206. RegisterCompareOpt<NUdf::TDataType<i16>, NUdf::TDataType<i16>, TFunc, TArgs>(registry, name);
  207. RegisterCompareOpt<NUdf::TDataType<i16>, NUdf::TDataType<i32>, TFunc, TArgs>(registry, name);
  208. RegisterCompareOpt<NUdf::TDataType<i16>, NUdf::TDataType<i64>, TFunc, TArgs>(registry, name);
  209. RegisterCompareOpt<NUdf::TDataType<i32>, NUdf::TDataType<i8>, TFunc, TArgs>(registry, name);
  210. RegisterCompareOpt<NUdf::TDataType<i32>, NUdf::TDataType<i16>, TFunc, TArgs>(registry, name);
  211. RegisterCompareOpt<NUdf::TDataType<i32>, NUdf::TDataType<i32>, TFunc, TArgs>(registry, name);
  212. RegisterCompareOpt<NUdf::TDataType<i32>, NUdf::TDataType<i64>, TFunc, TArgs>(registry, name);
  213. RegisterCompareOpt<NUdf::TDataType<i64>, NUdf::TDataType<i8>, TFunc, TArgs>(registry, name);
  214. RegisterCompareOpt<NUdf::TDataType<i64>, NUdf::TDataType<i16>, TFunc, TArgs>(registry, name);
  215. RegisterCompareOpt<NUdf::TDataType<i64>, NUdf::TDataType<i32>, TFunc, TArgs>(registry, name);
  216. RegisterCompareOpt<NUdf::TDataType<i64>, NUdf::TDataType<i64>, TFunc, TArgs>(registry, name);
  217. }
  218. template <
  219. template<typename, typename, bool> class TFunc,
  220. template<typename, typename, bool, bool, bool> class TArgs
  221. >
  222. void RegisterCompareSignedAndUnsigned(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  223. RegisterCompareOpt<NUdf::TDataType<i8>, NUdf::TDataType<ui8>, TFunc, TArgs>(registry, name);
  224. RegisterCompareOpt<NUdf::TDataType<i8>, NUdf::TDataType<ui16>, TFunc, TArgs>(registry, name);
  225. RegisterCompareOpt<NUdf::TDataType<i8>, NUdf::TDataType<ui32>, TFunc, TArgs>(registry, name);
  226. RegisterCompareOpt<NUdf::TDataType<i8>, NUdf::TDataType<ui64>, TFunc, TArgs>(registry, name);
  227. RegisterCompareOpt<NUdf::TDataType<i16>, NUdf::TDataType<ui8>, TFunc, TArgs>(registry, name);
  228. RegisterCompareOpt<NUdf::TDataType<i16>, NUdf::TDataType<ui16>, TFunc, TArgs>(registry, name);
  229. RegisterCompareOpt<NUdf::TDataType<i16>, NUdf::TDataType<ui32>, TFunc, TArgs>(registry, name);
  230. RegisterCompareOpt<NUdf::TDataType<i16>, NUdf::TDataType<ui64>, TFunc, TArgs>(registry, name);
  231. RegisterCompareOpt<NUdf::TDataType<i32>, NUdf::TDataType<ui8>, TFunc, TArgs>(registry, name);
  232. RegisterCompareOpt<NUdf::TDataType<i32>, NUdf::TDataType<ui16>, TFunc, TArgs>(registry, name);
  233. RegisterCompareOpt<NUdf::TDataType<i32>, NUdf::TDataType<ui32>, TFunc, TArgs>(registry, name);
  234. RegisterCompareOpt<NUdf::TDataType<i32>, NUdf::TDataType<ui64>, TFunc, TArgs>(registry, name);
  235. RegisterCompareOpt<NUdf::TDataType<i64>, NUdf::TDataType<ui8>, TFunc, TArgs>(registry, name);
  236. RegisterCompareOpt<NUdf::TDataType<i64>, NUdf::TDataType<ui16>, TFunc, TArgs>(registry, name);
  237. RegisterCompareOpt<NUdf::TDataType<i64>, NUdf::TDataType<ui32>, TFunc, TArgs>(registry, name);
  238. RegisterCompareOpt<NUdf::TDataType<i64>, NUdf::TDataType<ui64>, TFunc, TArgs>(registry, name);
  239. }
  240. template <
  241. template<typename, typename, bool> class TFunc,
  242. template<typename, typename, bool, bool, bool> class TArgs
  243. >
  244. void RegisterCompareUnsignedAndSigned(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  245. RegisterCompareOpt<NUdf::TDataType<ui8>, NUdf::TDataType<i8>, TFunc, TArgs>(registry, name);
  246. RegisterCompareOpt<NUdf::TDataType<ui8>, NUdf::TDataType<i16>, TFunc, TArgs>(registry, name);
  247. RegisterCompareOpt<NUdf::TDataType<ui8>, NUdf::TDataType<i32>, TFunc, TArgs>(registry, name);
  248. RegisterCompareOpt<NUdf::TDataType<ui8>, NUdf::TDataType<i64>, TFunc, TArgs>(registry, name);
  249. RegisterCompareOpt<NUdf::TDataType<ui16>, NUdf::TDataType<i8>, TFunc, TArgs>(registry, name);
  250. RegisterCompareOpt<NUdf::TDataType<ui16>, NUdf::TDataType<i16>, TFunc, TArgs>(registry, name);
  251. RegisterCompareOpt<NUdf::TDataType<ui16>, NUdf::TDataType<i32>, TFunc, TArgs>(registry, name);
  252. RegisterCompareOpt<NUdf::TDataType<ui16>, NUdf::TDataType<i64>, TFunc, TArgs>(registry, name);
  253. RegisterCompareOpt<NUdf::TDataType<ui32>, NUdf::TDataType<i8>, TFunc, TArgs>(registry, name);
  254. RegisterCompareOpt<NUdf::TDataType<ui32>, NUdf::TDataType<i16>, TFunc, TArgs>(registry, name);
  255. RegisterCompareOpt<NUdf::TDataType<ui32>, NUdf::TDataType<i32>, TFunc, TArgs>(registry, name);
  256. RegisterCompareOpt<NUdf::TDataType<ui32>, NUdf::TDataType<i64>, TFunc, TArgs>(registry, name);
  257. RegisterCompareOpt<NUdf::TDataType<ui64>, NUdf::TDataType<i8>, TFunc, TArgs>(registry, name);
  258. RegisterCompareOpt<NUdf::TDataType<ui64>, NUdf::TDataType<i16>, TFunc, TArgs>(registry, name);
  259. RegisterCompareOpt<NUdf::TDataType<ui64>, NUdf::TDataType<i32>, TFunc, TArgs>(registry, name);
  260. RegisterCompareOpt<NUdf::TDataType<ui64>, NUdf::TDataType<i64>, TFunc, TArgs>(registry, name);
  261. }
  262. template <
  263. template<typename, typename, bool> class TFunc,
  264. template<typename, typename, bool, bool, bool> class TArgs
  265. >
  266. void RegisterCompareReal(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  267. RegisterCompareOpt<NUdf::TDataType<i8>, NUdf::TDataType<float>, TFunc, TArgs>(registry, name);
  268. RegisterCompareOpt<NUdf::TDataType<i8>, NUdf::TDataType<double>, TFunc, TArgs>(registry, name);
  269. RegisterCompareOpt<NUdf::TDataType<ui8>, NUdf::TDataType<float>, TFunc, TArgs>(registry, name);
  270. RegisterCompareOpt<NUdf::TDataType<ui8>, NUdf::TDataType<double>, TFunc, TArgs>(registry, name);
  271. RegisterCompareOpt<NUdf::TDataType<i16>, NUdf::TDataType<float>, TFunc, TArgs>(registry, name);
  272. RegisterCompareOpt<NUdf::TDataType<i16>, NUdf::TDataType<double>, TFunc, TArgs>(registry, name);
  273. RegisterCompareOpt<NUdf::TDataType<ui16>, NUdf::TDataType<float>, TFunc, TArgs>(registry, name);
  274. RegisterCompareOpt<NUdf::TDataType<ui16>, NUdf::TDataType<double>, TFunc, TArgs>(registry, name);
  275. RegisterCompareOpt<NUdf::TDataType<i32>, NUdf::TDataType<float>, TFunc, TArgs>(registry, name);
  276. RegisterCompareOpt<NUdf::TDataType<i32>, NUdf::TDataType<double>, TFunc, TArgs>(registry, name);
  277. RegisterCompareOpt<NUdf::TDataType<ui32>, NUdf::TDataType<float>, TFunc, TArgs>(registry, name);
  278. RegisterCompareOpt<NUdf::TDataType<ui32>, NUdf::TDataType<double>, TFunc, TArgs>(registry, name);
  279. RegisterCompareOpt<NUdf::TDataType<i64>, NUdf::TDataType<float>, TFunc, TArgs>(registry, name);
  280. RegisterCompareOpt<NUdf::TDataType<i64>, NUdf::TDataType<double>, TFunc, TArgs>(registry, name);
  281. RegisterCompareOpt<NUdf::TDataType<ui64>, NUdf::TDataType<float>, TFunc, TArgs>(registry, name);
  282. RegisterCompareOpt<NUdf::TDataType<ui64>, NUdf::TDataType<double>, TFunc, TArgs>(registry, name);
  283. RegisterCompareOpt<NUdf::TDataType<float>, NUdf::TDataType<i8>, TFunc, TArgs>(registry, name);
  284. RegisterCompareOpt<NUdf::TDataType<float>, NUdf::TDataType<ui8>, TFunc, TArgs>(registry, name);
  285. RegisterCompareOpt<NUdf::TDataType<float>, NUdf::TDataType<i16>, TFunc, TArgs>(registry, name);
  286. RegisterCompareOpt<NUdf::TDataType<float>, NUdf::TDataType<ui16>, TFunc, TArgs>(registry, name);
  287. RegisterCompareOpt<NUdf::TDataType<float>, NUdf::TDataType<i32>, TFunc, TArgs>(registry, name);
  288. RegisterCompareOpt<NUdf::TDataType<float>, NUdf::TDataType<ui32>, TFunc, TArgs>(registry, name);
  289. RegisterCompareOpt<NUdf::TDataType<float>, NUdf::TDataType<i64>, TFunc, TArgs>(registry, name);
  290. RegisterCompareOpt<NUdf::TDataType<float>, NUdf::TDataType<ui64>, TFunc, TArgs>(registry, name);
  291. RegisterCompareOpt<NUdf::TDataType<float>, NUdf::TDataType<float>, TFunc, TArgs>(registry, name);
  292. RegisterCompareOpt<NUdf::TDataType<float>, NUdf::TDataType<double>, TFunc, TArgs>(registry, name);
  293. RegisterCompareOpt<NUdf::TDataType<double>, NUdf::TDataType<i8>, TFunc, TArgs>(registry, name);
  294. RegisterCompareOpt<NUdf::TDataType<double>, NUdf::TDataType<ui8>, TFunc, TArgs>(registry, name);
  295. RegisterCompareOpt<NUdf::TDataType<double>, NUdf::TDataType<i16>, TFunc, TArgs>(registry, name);
  296. RegisterCompareOpt<NUdf::TDataType<double>, NUdf::TDataType<ui16>, TFunc, TArgs>(registry, name);
  297. RegisterCompareOpt<NUdf::TDataType<double>, NUdf::TDataType<i32>, TFunc, TArgs>(registry, name);
  298. RegisterCompareOpt<NUdf::TDataType<double>, NUdf::TDataType<ui32>, TFunc, TArgs>(registry, name);
  299. RegisterCompareOpt<NUdf::TDataType<double>, NUdf::TDataType<i64>, TFunc, TArgs>(registry, name);
  300. RegisterCompareOpt<NUdf::TDataType<double>, NUdf::TDataType<ui64>, TFunc, TArgs>(registry, name);
  301. RegisterCompareOpt<NUdf::TDataType<double>, NUdf::TDataType<float>, TFunc, TArgs>(registry, name);
  302. RegisterCompareOpt<NUdf::TDataType<double>, NUdf::TDataType<double>, TFunc, TArgs>(registry, name);
  303. }
  304. template <
  305. template<typename, typename, bool> class TFunc,
  306. template<typename, typename, bool, bool, bool> class TArgs
  307. >
  308. void RegisterCompareBool(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  309. RegisterCompareOpt<NUdf::TDataType<bool>, NUdf::TDataType<bool>, TFunc, TArgs>(registry, name);
  310. }
  311. template <
  312. template<typename, typename, bool> class TFunc,
  313. template<typename, typename, bool, bool, bool> class TArgs
  314. >
  315. void RegisterCompareIntegral(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  316. RegisterCompareSigned<TFunc, TArgs>(registry, name);
  317. RegisterCompareUnsigned<TFunc, TArgs>(registry, name);
  318. RegisterCompareSignedAndUnsigned<TFunc, TArgs>(registry, name);
  319. RegisterCompareUnsignedAndSigned<TFunc, TArgs>(registry, name);
  320. }
  321. template <
  322. template<typename, typename, bool> class TFunc,
  323. template<typename, typename, bool, bool, bool> class TArgs
  324. >
  325. void RegisterComparePrimitive(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  326. RegisterCompareBool<TFunc, TArgs>(registry, name);
  327. RegisterCompareReal<TFunc, TArgs>(registry, name);
  328. RegisterCompareIntegral<TFunc, TArgs>(registry, name);
  329. }
  330. template <
  331. template<typename, typename, bool> class TFunc,
  332. template<typename, typename, bool, bool, bool> class TArgs
  333. >
  334. void RegisterAggrComparePrimitive(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  335. RegisterAggrCompareOpt<NUdf::TDataType<bool>, TFunc, TArgs>(registry, name);
  336. RegisterAggrCompareOpt<NUdf::TDataType<i8>, TFunc, TArgs>(registry, name);
  337. RegisterAggrCompareOpt<NUdf::TDataType<ui8>, TFunc, TArgs>(registry, name);
  338. RegisterAggrCompareOpt<NUdf::TDataType<i16>, TFunc, TArgs>(registry, name);
  339. RegisterAggrCompareOpt<NUdf::TDataType<ui16>, TFunc, TArgs>(registry, name);
  340. RegisterAggrCompareOpt<NUdf::TDataType<i32>, TFunc, TArgs>(registry, name);
  341. RegisterAggrCompareOpt<NUdf::TDataType<ui32>, TFunc, TArgs>(registry, name);
  342. RegisterAggrCompareOpt<NUdf::TDataType<i64>, TFunc, TArgs>(registry, name);
  343. RegisterAggrCompareOpt<NUdf::TDataType<ui64>, TFunc, TArgs>(registry, name);
  344. RegisterAggrCompareOpt<NUdf::TDataType<float>, TFunc, TArgs>(registry, name);
  345. RegisterAggrCompareOpt<NUdf::TDataType<double>, TFunc, TArgs>(registry, name);
  346. }
  347. template <
  348. template<typename, typename, bool> class TFunc,
  349. template<typename, typename, bool, bool, bool> class TArgs
  350. >
  351. void RegisterCompareDatetime(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  352. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate>, NUdf::TDataType<NUdf::TDate>, TFunc, TArgs>(registry, name);
  353. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate>, NUdf::TDataType<NUdf::TDatetime>, TFunc, TArgs>(registry, name);
  354. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate>, NUdf::TDataType<NUdf::TTimestamp>, TFunc, TArgs>(registry, name);
  355. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime>, NUdf::TDataType<NUdf::TDate>, TFunc, TArgs>(registry, name);
  356. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime>, NUdf::TDataType<NUdf::TDatetime>, TFunc, TArgs>(registry, name);
  357. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime>, NUdf::TDataType<NUdf::TTimestamp>, TFunc, TArgs>(registry, name);
  358. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp>, NUdf::TDataType<NUdf::TDate>, TFunc, TArgs>(registry, name);
  359. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp>, NUdf::TDataType<NUdf::TDatetime>, TFunc, TArgs>(registry, name);
  360. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp>, NUdf::TDataType<NUdf::TTimestamp>, TFunc, TArgs>(registry, name);
  361. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TDate>, TFunc, TArgs>(registry, name);
  362. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TDatetime>, TFunc, TArgs>(registry, name);
  363. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TTimestamp>, TFunc, TArgs>(registry, name);
  364. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TDate>, TFunc, TArgs>(registry, name);
  365. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TDatetime>, TFunc, TArgs>(registry, name);
  366. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TTimestamp>, TFunc, TArgs>(registry, name);
  367. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TDate>, TFunc, TArgs>(registry, name);
  368. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TDatetime>, TFunc, TArgs>(registry, name);
  369. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTimestamp>, TFunc, TArgs>(registry, name);
  370. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate>, NUdf::TDataType<NUdf::TTzDate>, TFunc, TArgs>(registry, name);
  371. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate>, NUdf::TDataType<NUdf::TTzDatetime>, TFunc, TArgs>(registry, name);
  372. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate>, NUdf::TDataType<NUdf::TTzTimestamp>, TFunc, TArgs>(registry, name);
  373. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime>, NUdf::TDataType<NUdf::TTzDate>, TFunc, TArgs>(registry, name);
  374. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime>, NUdf::TDataType<NUdf::TTzDatetime>, TFunc, TArgs>(registry, name);
  375. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime>, NUdf::TDataType<NUdf::TTzTimestamp>, TFunc, TArgs>(registry, name);
  376. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp>, NUdf::TDataType<NUdf::TTzDate>, TFunc, TArgs>(registry, name);
  377. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp>, NUdf::TDataType<NUdf::TTzDatetime>, TFunc, TArgs>(registry, name);
  378. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp>, NUdf::TDataType<NUdf::TTzTimestamp>, TFunc, TArgs>(registry, name);
  379. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TTzDate>, TFunc, TArgs>(registry, name);
  380. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TTzDatetime>, TFunc, TArgs>(registry, name);
  381. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TTzTimestamp>, TFunc, TArgs>(registry, name);
  382. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TTzDate>, TFunc, TArgs>(registry, name);
  383. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TTzDatetime>, TFunc, TArgs>(registry, name);
  384. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TTzTimestamp>, TFunc, TArgs>(registry, name);
  385. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTzDate>, TFunc, TArgs>(registry, name);
  386. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTzDatetime>, TFunc, TArgs>(registry, name);
  387. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTzTimestamp>, TFunc, TArgs>(registry, name);
  388. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TInterval>, NUdf::TDataType<NUdf::TInterval>, TFunc, TArgs>(registry, name);
  389. }
  390. template <
  391. template<typename, typename, bool> class TFunc,
  392. template<typename, typename, bool, bool, bool> class TArgs
  393. >
  394. void RegisterCompareBigDatetime(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  395. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate32>, NUdf::TDataType<NUdf::TDate32>, TFunc, TArgs>(registry, name);
  396. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate32>, NUdf::TDataType<NUdf::TDatetime64>, TFunc, TArgs>(registry, name);
  397. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate32>, NUdf::TDataType<NUdf::TTimestamp64>, TFunc, TArgs>(registry, name);
  398. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime64>, NUdf::TDataType<NUdf::TDate32>, TFunc, TArgs>(registry, name);
  399. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime64>, NUdf::TDataType<NUdf::TDatetime64>, TFunc, TArgs>(registry, name);
  400. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime64>, NUdf::TDataType<NUdf::TTimestamp64>, TFunc, TArgs>(registry, name);
  401. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp64>, NUdf::TDataType<NUdf::TDate32>, TFunc, TArgs>(registry, name);
  402. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp64>, NUdf::TDataType<NUdf::TDatetime64>, TFunc, TArgs>(registry, name);
  403. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp64>, NUdf::TDataType<NUdf::TTimestamp64>, TFunc, TArgs>(registry, name);
  404. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TTzDate32>, TFunc, TArgs>(registry, name);
  405. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TTzDatetime64>, TFunc, TArgs>(registry, name);
  406. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TTzTimestamp64>, TFunc, TArgs>(registry, name);
  407. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TTzDate32>, TFunc, TArgs>(registry, name);
  408. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TTzDatetime64>, TFunc, TArgs>(registry, name);
  409. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TTzTimestamp64>, TFunc, TArgs>(registry, name);
  410. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TTzDate32>, TFunc, TArgs>(registry, name);
  411. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TTzDatetime64>, TFunc, TArgs>(registry, name);
  412. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TTzTimestamp64>, TFunc, TArgs>(registry, name);
  413. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TInterval64>, NUdf::TDataType<NUdf::TInterval64>, TFunc, TArgs>(registry, name);
  414. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate>, NUdf::TDataType<NUdf::TDate32>, TFunc, TArgs>(registry, name);
  415. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate>, NUdf::TDataType<NUdf::TDatetime64>, TFunc, TArgs>(registry, name);
  416. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate>, NUdf::TDataType<NUdf::TTimestamp64>, TFunc, TArgs>(registry, name);
  417. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TDate32>, TFunc, TArgs>(registry, name);
  418. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TDatetime64>, TFunc, TArgs>(registry, name);
  419. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TTimestamp64>, TFunc, TArgs>(registry, name);
  420. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime>, NUdf::TDataType<NUdf::TDate32>, TFunc, TArgs>(registry, name);
  421. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime>, NUdf::TDataType<NUdf::TDatetime64>, TFunc, TArgs>(registry, name);
  422. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime>, NUdf::TDataType<NUdf::TTimestamp64>, TFunc, TArgs>(registry, name);
  423. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TDate32>, TFunc, TArgs>(registry, name);
  424. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TDatetime64>, TFunc, TArgs>(registry, name);
  425. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TTimestamp64>, TFunc, TArgs>(registry, name);
  426. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp>, NUdf::TDataType<NUdf::TDate32>, TFunc, TArgs>(registry, name);
  427. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp>, NUdf::TDataType<NUdf::TDatetime64>, TFunc, TArgs>(registry, name);
  428. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp>, NUdf::TDataType<NUdf::TTimestamp64>, TFunc, TArgs>(registry, name);
  429. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TDate32>, TFunc, TArgs>(registry, name);
  430. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TDatetime64>, TFunc, TArgs>(registry, name);
  431. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTimestamp64>, TFunc, TArgs>(registry, name);
  432. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate>, NUdf::TDataType<NUdf::TTzDate32>, TFunc, TArgs>(registry, name);
  433. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate>, NUdf::TDataType<NUdf::TTzDatetime64>, TFunc, TArgs>(registry, name);
  434. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate>, NUdf::TDataType<NUdf::TTzTimestamp64>, TFunc, TArgs>(registry, name);
  435. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TTzDate32>, TFunc, TArgs>(registry, name);
  436. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TTzDatetime64>, TFunc, TArgs>(registry, name);
  437. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TTzTimestamp64>, TFunc, TArgs>(registry, name);
  438. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime>, NUdf::TDataType<NUdf::TTzDate32>, TFunc, TArgs>(registry, name);
  439. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime>, NUdf::TDataType<NUdf::TTzDatetime64>, TFunc, TArgs>(registry, name);
  440. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime>, NUdf::TDataType<NUdf::TTzTimestamp64>, TFunc, TArgs>(registry, name);
  441. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TTzDate32>, TFunc, TArgs>(registry, name);
  442. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TTzDatetime64>, TFunc, TArgs>(registry, name);
  443. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TTzTimestamp64>, TFunc, TArgs>(registry, name);
  444. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp>, NUdf::TDataType<NUdf::TTzDate32>, TFunc, TArgs>(registry, name);
  445. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp>, NUdf::TDataType<NUdf::TTzDatetime64>, TFunc, TArgs>(registry, name);
  446. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp>, NUdf::TDataType<NUdf::TTzTimestamp64>, TFunc, TArgs>(registry, name);
  447. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTzDate32>, TFunc, TArgs>(registry, name);
  448. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTzDatetime64>, TFunc, TArgs>(registry, name);
  449. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTzTimestamp64>, TFunc, TArgs>(registry, name);
  450. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate32>, NUdf::TDataType<NUdf::TDate>, TFunc, TArgs>(registry, name);
  451. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime64>, NUdf::TDataType<NUdf::TDate>, TFunc, TArgs>(registry, name);
  452. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp64>, NUdf::TDataType<NUdf::TDate>, TFunc, TArgs>(registry, name);
  453. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate32>, NUdf::TDataType<NUdf::TTzDate>, TFunc, TArgs>(registry, name);
  454. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime64>, NUdf::TDataType<NUdf::TTzDate>, TFunc, TArgs>(registry, name);
  455. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp64>, NUdf::TDataType<NUdf::TTzDate>, TFunc, TArgs>(registry, name);
  456. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate32>, NUdf::TDataType<NUdf::TDatetime>, TFunc, TArgs>(registry, name);
  457. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime64>, NUdf::TDataType<NUdf::TDatetime>, TFunc, TArgs>(registry, name);
  458. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp64>, NUdf::TDataType<NUdf::TDatetime>, TFunc, TArgs>(registry, name);
  459. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate32>, NUdf::TDataType<NUdf::TTzDatetime>, TFunc, TArgs>(registry, name);
  460. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime64>, NUdf::TDataType<NUdf::TTzDatetime>, TFunc, TArgs>(registry, name);
  461. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp64>, NUdf::TDataType<NUdf::TTzDatetime>, TFunc, TArgs>(registry, name);
  462. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate32>, NUdf::TDataType<NUdf::TTimestamp>, TFunc, TArgs>(registry, name);
  463. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime64>, NUdf::TDataType<NUdf::TTimestamp>, TFunc, TArgs>(registry, name);
  464. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp64>, NUdf::TDataType<NUdf::TTimestamp>, TFunc, TArgs>(registry, name);
  465. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate32>, NUdf::TDataType<NUdf::TTzTimestamp>, TFunc, TArgs>(registry, name);
  466. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime64>, NUdf::TDataType<NUdf::TTzTimestamp>, TFunc, TArgs>(registry, name);
  467. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp64>, NUdf::TDataType<NUdf::TTzTimestamp>, TFunc, TArgs>(registry, name);
  468. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TDate>, TFunc, TArgs>(registry, name);
  469. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TDate>, TFunc, TArgs>(registry, name);
  470. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TDate>, TFunc, TArgs>(registry, name);
  471. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TTzDate>, TFunc, TArgs>(registry, name);
  472. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TTzDate>, TFunc, TArgs>(registry, name);
  473. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TTzDate>, TFunc, TArgs>(registry, name);
  474. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TDatetime>, TFunc, TArgs>(registry, name);
  475. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TDatetime>, TFunc, TArgs>(registry, name);
  476. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TDatetime>, TFunc, TArgs>(registry, name);
  477. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TTzDatetime>, TFunc, TArgs>(registry, name);
  478. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TTzDatetime>, TFunc, TArgs>(registry, name);
  479. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TTzDatetime>, TFunc, TArgs>(registry, name);
  480. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TTimestamp>, TFunc, TArgs>(registry, name);
  481. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TTimestamp>, TFunc, TArgs>(registry, name);
  482. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TTimestamp>, TFunc, TArgs>(registry, name);
  483. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TTzTimestamp>, TFunc, TArgs>(registry, name);
  484. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TTzTimestamp>, TFunc, TArgs>(registry, name);
  485. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TTzTimestamp>, TFunc, TArgs>(registry, name);
  486. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate32>, NUdf::TDataType<NUdf::TTzDate32>, TFunc, TArgs>(registry, name);
  487. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate32>, NUdf::TDataType<NUdf::TTzDatetime64>, TFunc, TArgs>(registry, name);
  488. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDate32>, NUdf::TDataType<NUdf::TTzTimestamp64>, TFunc, TArgs>(registry, name);
  489. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime64>, NUdf::TDataType<NUdf::TTzDate32>, TFunc, TArgs>(registry, name);
  490. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime64>, NUdf::TDataType<NUdf::TTzDatetime64>, TFunc, TArgs>(registry, name);
  491. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TDatetime64>, NUdf::TDataType<NUdf::TTzTimestamp64>, TFunc, TArgs>(registry, name);
  492. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp64>, NUdf::TDataType<NUdf::TTzDate32>, TFunc, TArgs>(registry, name);
  493. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp64>, NUdf::TDataType<NUdf::TTzDatetime64>, TFunc, TArgs>(registry, name);
  494. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp64>, NUdf::TDataType<NUdf::TTzTimestamp64>, TFunc, TArgs>(registry, name);
  495. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TDate32>, TFunc, TArgs>(registry, name);
  496. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TDatetime64>, TFunc, TArgs>(registry, name);
  497. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDate32>, NUdf::TDataType<NUdf::TTimestamp64>, TFunc, TArgs>(registry, name);
  498. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TDate32>, TFunc, TArgs>(registry, name);
  499. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TDatetime64>, TFunc, TArgs>(registry, name);
  500. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzDatetime64>, NUdf::TDataType<NUdf::TTimestamp64>, TFunc, TArgs>(registry, name);
  501. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TDate32>, TFunc, TArgs>(registry, name);
  502. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TDatetime64>, TFunc, TArgs>(registry, name);
  503. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, NUdf::TDataType<NUdf::TTimestamp64>, TFunc, TArgs>(registry, name);
  504. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TInterval>, NUdf::TDataType<NUdf::TInterval64>, TFunc, TArgs>(registry, name);
  505. RegisterComparePolyOpt<NUdf::TDataType<NUdf::TInterval64>, NUdf::TDataType<NUdf::TInterval>, TFunc, TArgs>(registry, name);
  506. }
  507. template <
  508. template<typename, typename, bool> class TFunc,
  509. template<typename, typename, bool, bool, bool> class TArgs
  510. >
  511. void RegisterAggrCompareDatetime(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  512. RegisterAggrComparePolyOpt<NUdf::TDataType<NUdf::TDate>, TFunc, TArgs>(registry, name);
  513. RegisterAggrComparePolyOpt<NUdf::TDataType<NUdf::TDatetime>, TFunc, TArgs>(registry, name);
  514. RegisterAggrComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp>, TFunc, TArgs>(registry, name);
  515. RegisterAggrComparePolyOpt<NUdf::TDataType<NUdf::TInterval>, TFunc, TArgs>(registry, name);
  516. }
  517. template <
  518. template<typename, typename, bool> class TFunc,
  519. template<typename, typename, bool, bool, bool> class TArgs
  520. >
  521. void RegisterAggrCompareTzDatetime(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  522. RegisterAggrCompareOpt<NUdf::TDataType<NUdf::TTzDate>, TFunc, TArgs>(registry, name);
  523. RegisterAggrCompareOpt<NUdf::TDataType<NUdf::TTzDatetime>, TFunc, TArgs>(registry, name);
  524. RegisterAggrCompareOpt<NUdf::TDataType<NUdf::TTzTimestamp>, TFunc, TArgs>(registry, name);
  525. }
  526. template <
  527. template<typename, typename, bool> class TFunc,
  528. template<typename, typename, bool, bool, bool> class TArgs
  529. >
  530. void RegisterAggrCompareBigDatetime(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  531. RegisterAggrComparePolyOpt<NUdf::TDataType<NUdf::TDate32>, TFunc, TArgs>(registry, name);
  532. RegisterAggrComparePolyOpt<NUdf::TDataType<NUdf::TDatetime64>, TFunc, TArgs>(registry, name);
  533. RegisterAggrComparePolyOpt<NUdf::TDataType<NUdf::TTimestamp64>, TFunc, TArgs>(registry, name);
  534. RegisterAggrComparePolyOpt<NUdf::TDataType<NUdf::TInterval64>, TFunc, TArgs>(registry, name);
  535. }
  536. template <
  537. template<typename, typename, bool> class TFunc,
  538. template<typename, typename, bool, bool, bool> class TArgs
  539. >
  540. void RegisterAggrCompareBigTzDatetime(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  541. RegisterAggrCompareOpt<NUdf::TDataType<NUdf::TTzDate32>, TFunc, TArgs>(registry, name);
  542. RegisterAggrCompareOpt<NUdf::TDataType<NUdf::TTzDatetime64>, TFunc, TArgs>(registry, name);
  543. RegisterAggrCompareOpt<NUdf::TDataType<NUdf::TTzTimestamp64>, TFunc, TArgs>(registry, name);
  544. }
  545. template <
  546. template<NUdf::EDataSlot> class TFunc,
  547. template<typename, typename, bool, bool, bool> class TArgs,
  548. bool WithSpecial = true
  549. >
  550. void RegisterCompareStrings(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  551. RegisterCompareCustomOpt<NUdf::TDataType<char*>, NUdf::TDataType<char*>, TFunc<NUdf::EDataSlot::String>, TArgs>(registry, name);
  552. RegisterCompareCustomOpt<NUdf::TDataType<NUdf::TUtf8>, NUdf::TDataType<NUdf::TUtf8>, TFunc<NUdf::EDataSlot::Utf8>, TArgs>(registry, name);
  553. RegisterCompareCustomOpt<NUdf::TDataType<NUdf::TUtf8>, NUdf::TDataType<char*>, TFunc<NUdf::EDataSlot::Utf8>, TArgs>(registry, name);
  554. RegisterCompareCustomOpt<NUdf::TDataType<char*>, NUdf::TDataType<NUdf::TUtf8>, TFunc<NUdf::EDataSlot::Utf8>, TArgs>(registry, name);
  555. if constexpr (WithSpecial) {
  556. RegisterCompareCustomOpt<NUdf::TDataType<NUdf::TUuid>, NUdf::TDataType<NUdf::TUuid>, TFunc<NUdf::EDataSlot::Uuid>, TArgs>(registry, name);
  557. RegisterCompareCustomOpt<NUdf::TDataType<NUdf::TDyNumber>, NUdf::TDataType<NUdf::TDyNumber>, TFunc<NUdf::EDataSlot::DyNumber>, TArgs>(registry, name);
  558. }
  559. }
  560. template <
  561. template<NUdf::EDataSlot> class TFunc,
  562. template<typename, typename, bool, bool, bool> class TArgs
  563. >
  564. void RegisterAggrCompareStrings(IBuiltinFunctionRegistry& registry, const std::string_view& name) {
  565. RegisterAggrCompareCustomOpt<NUdf::TDataType<char*>, TFunc<NUdf::EDataSlot::String>, TArgs>(registry, name);
  566. RegisterAggrCompareCustomOpt<NUdf::TDataType<NUdf::TUtf8>, TFunc<NUdf::EDataSlot::Utf8>, TArgs>(registry, name);
  567. RegisterAggrCompareCustomOpt<NUdf::TDataType<NUdf::TUuid>, TFunc<NUdf::EDataSlot::Uuid>, TArgs>(registry, name);
  568. RegisterAggrCompareCustomOpt<NUdf::TDataType<NUdf::TDyNumber>, TFunc<NUdf::EDataSlot::DyNumber>, TArgs>(registry, name);
  569. }
  570. void RegisterEquals(IBuiltinFunctionRegistry& registry);
  571. void RegisterEquals(TKernelFamilyMap& kernelFamilyMap);
  572. void RegisterNotEquals(IBuiltinFunctionRegistry& registry);
  573. void RegisterNotEquals(TKernelFamilyMap& kernelFamilyMap);
  574. void RegisterLess(IBuiltinFunctionRegistry& registry);
  575. void RegisterLess(TKernelFamilyMap& kernelFamilyMap);
  576. void RegisterLessOrEqual(IBuiltinFunctionRegistry& registry);
  577. void RegisterLessOrEqual(TKernelFamilyMap& kernelFamilyMap);
  578. void RegisterGreater(IBuiltinFunctionRegistry& registry);
  579. void RegisterGreater(TKernelFamilyMap& kernelFamilyMap);
  580. void RegisterGreaterOrEqual(IBuiltinFunctionRegistry& registry);
  581. void RegisterGreaterOrEqual(TKernelFamilyMap& kernelFamilyMap);
  582. }
  583. }