yql_codec.cpp 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476
  1. #include "yql_codec.h"
  2. #include "yql_codec_type_flags.h"
  3. #include <yql/essentials/core/yql_expr_type_annotation.h>
  4. #include <yql/essentials/public/decimal/yql_decimal.h>
  5. #include <yql/essentials/public/decimal/yql_decimal_serialize.h>
  6. #include <yql/essentials/minikql/mkql_node_cast.h>
  7. #include <yql/essentials/minikql/mkql_string_util.h>
  8. #include <yql/essentials/minikql/mkql_type_builder.h>
  9. #include <yql/essentials/minikql/computation/mkql_computation_node_pack.h>
  10. #include <yql/essentials/public/result_format/yql_restricted_yson.h>
  11. #include <yql/essentials/utils/yql_panic.h>
  12. #include <yql/essentials/utils/swap_bytes.h>
  13. #include <library/cpp/yson/node/node_io.h>
  14. #include <library/cpp/yson/writer.h>
  15. #include <library/cpp/string_utils/base64/base64.h>
  16. #include <library/cpp/yson/parser.h>
  17. #include <library/cpp/yson/detail.h>
  18. #include <util/string/cast.h>
  19. #include <util/generic/map.h>
  20. namespace NYql {
  21. namespace NCommon {
  22. using namespace NKikimr;
  23. using namespace NKikimr::NMiniKQL;
  24. using namespace NYson::NDetail;
  25. void WriteYsonValueImpl(NResult::TYsonResultWriter& writer, const NUdf::TUnboxedValuePod& value, TType* type,
  26. const TVector<ui32>* structPositions) {
  27. // Result format
  28. switch (type->GetKind()) {
  29. case TType::EKind::Void:
  30. writer.OnVoid();
  31. return;
  32. case TType::EKind::Null:
  33. writer.OnNull();
  34. return;
  35. case TType::EKind::EmptyList:
  36. writer.OnEmptyList();
  37. return;
  38. case TType::EKind::EmptyDict:
  39. writer.OnEmptyDict();
  40. return;
  41. case TType::EKind::Data:
  42. {
  43. auto dataType = AS_TYPE(TDataType, type);
  44. switch (*dataType->GetDataSlot()) {
  45. case NUdf::EDataSlot::Bool:
  46. writer.OnBooleanScalar(value.Get<bool>());
  47. return;
  48. case NUdf::EDataSlot::Int32:
  49. writer.OnInt64Scalar(value.Get<i32>());
  50. return;
  51. case NUdf::EDataSlot::Uint32:
  52. writer.OnUint64Scalar(value.Get<ui32>());
  53. return;
  54. case NUdf::EDataSlot::Int64:
  55. writer.OnInt64Scalar(value.Get<i64>());
  56. return;
  57. case NUdf::EDataSlot::Uint64:
  58. writer.OnUint64Scalar(value.Get<ui64>());
  59. return;
  60. case NUdf::EDataSlot::Uint8:
  61. writer.OnUint64Scalar(value.Get<ui8>());
  62. return;
  63. case NUdf::EDataSlot::Int8:
  64. writer.OnInt64Scalar(value.Get<i8>());
  65. return;
  66. case NUdf::EDataSlot::Uint16:
  67. writer.OnUint64Scalar(value.Get<ui16>());
  68. return;
  69. case NUdf::EDataSlot::Int16:
  70. writer.OnInt64Scalar(value.Get<i16>());
  71. return;
  72. case NUdf::EDataSlot::Float:
  73. writer.OnFloatScalar(value.Get<float>());
  74. return;
  75. case NUdf::EDataSlot::Double:
  76. writer.OnDoubleScalar(value.Get<double>());
  77. return;
  78. case NUdf::EDataSlot::Json:
  79. case NUdf::EDataSlot::Utf8:
  80. // assume underlying string is utf8
  81. writer.OnUtf8StringScalar(value.AsStringRef());
  82. return;
  83. case NUdf::EDataSlot::String:
  84. case NUdf::EDataSlot::Uuid:
  85. case NUdf::EDataSlot::DyNumber:
  86. writer.OnStringScalar(value.AsStringRef());
  87. return;
  88. case NUdf::EDataSlot::Decimal: {
  89. const auto params = static_cast<TDataDecimalType*>(type)->GetParams();
  90. const auto str = NDecimal::ToString(value.GetInt128(), params.first, params.second);
  91. const auto size = str ? std::strlen(str) : 0;
  92. writer.OnUtf8StringScalar(TStringBuf(str, size));
  93. return;
  94. }
  95. case NUdf::EDataSlot::Yson:
  96. NResult::EncodeRestrictedYson(writer, value.AsStringRef());
  97. return;
  98. case NUdf::EDataSlot::Date:
  99. writer.OnUint64Scalar(value.Get<ui16>());
  100. return;
  101. case NUdf::EDataSlot::Datetime:
  102. writer.OnUint64Scalar(value.Get<ui32>());
  103. return;
  104. case NUdf::EDataSlot::Timestamp:
  105. writer.OnUint64Scalar(value.Get<ui64>());
  106. return;
  107. case NUdf::EDataSlot::Interval:
  108. writer.OnInt64Scalar(value.Get<i64>());
  109. return;
  110. case NUdf::EDataSlot::TzDate:
  111. case NUdf::EDataSlot::TzDatetime:
  112. case NUdf::EDataSlot::TzTimestamp:
  113. case NUdf::EDataSlot::TzDate32:
  114. case NUdf::EDataSlot::TzDatetime64:
  115. case NUdf::EDataSlot::TzTimestamp64:
  116. case NUdf::EDataSlot::JsonDocument: {
  117. const NUdf::TUnboxedValue out(ValueToString(*dataType->GetDataSlot(), value));
  118. writer.OnUtf8StringScalar(out.AsStringRef());
  119. return;
  120. }
  121. case NUdf::EDataSlot::Date32:
  122. writer.OnInt64Scalar(value.Get<i32>());
  123. return;
  124. case NUdf::EDataSlot::Datetime64:
  125. writer.OnInt64Scalar(value.Get<i64>());
  126. return;
  127. case NUdf::EDataSlot::Timestamp64:
  128. writer.OnInt64Scalar(value.Get<i64>());
  129. return;
  130. case NUdf::EDataSlot::Interval64:
  131. writer.OnInt64Scalar(value.Get<i64>());
  132. return;
  133. }
  134. }
  135. break;
  136. case TType::EKind::Pg:
  137. {
  138. auto pgType = AS_TYPE(TPgType, type);
  139. WriteYsonValuePg(writer, value, pgType, structPositions);
  140. return;
  141. }
  142. case TType::EKind::Struct:
  143. {
  144. writer.OnBeginList();
  145. auto structType = AS_TYPE(TStructType, type);
  146. if (structPositions && structPositions->size() != structType->GetMembersCount()) {
  147. YQL_ENSURE(false, "Invalid struct positions");
  148. }
  149. for (ui32 i = 0, e = structType->GetMembersCount(); i < e; ++i) {
  150. const ui32 pos = structPositions ? (*structPositions)[i] : i;
  151. if (pos < e) {
  152. writer.OnListItem();
  153. WriteYsonValueImpl(writer, value.GetElement(pos), structType->GetMemberType(pos), nullptr);
  154. }
  155. }
  156. writer.OnEndList();
  157. return;
  158. }
  159. case TType::EKind::List:
  160. {
  161. writer.OnBeginList();
  162. auto listType = AS_TYPE(TListType, type);
  163. const auto it = value.GetListIterator();
  164. for (NUdf::TUnboxedValue item; it.Next(item);) {
  165. writer.OnListItem();
  166. WriteYsonValueImpl(writer, item, listType->GetItemType(), nullptr);
  167. }
  168. writer.OnEndList();
  169. return;
  170. }
  171. case TType::EKind::Optional:
  172. {
  173. if (!value) {
  174. writer.OnEntity();
  175. } else {
  176. writer.OnBeginList();
  177. auto optionalType = AS_TYPE(TOptionalType, type);
  178. writer.OnListItem();
  179. WriteYsonValueImpl(writer, value.GetOptionalValue(), optionalType->GetItemType(), nullptr);
  180. writer.OnEndList();
  181. }
  182. return;
  183. }
  184. case TType::EKind::Dict:
  185. {
  186. writer.OnBeginList();
  187. auto dictType = AS_TYPE(TDictType, type);
  188. const auto it = value.GetDictIterator();
  189. for (NUdf::TUnboxedValue key, payload; it.NextPair(key, payload);) {
  190. writer.OnListItem();
  191. writer.OnBeginList();
  192. {
  193. writer.OnListItem();
  194. WriteYsonValueImpl(writer, key, dictType->GetKeyType(), nullptr);
  195. writer.OnListItem();
  196. WriteYsonValueImpl(writer, payload, dictType->GetPayloadType(), nullptr);
  197. }
  198. writer.OnEndList();
  199. }
  200. writer.OnEndList();
  201. }
  202. return;
  203. case TType::EKind::Tuple:
  204. {
  205. writer.OnBeginList();
  206. auto tupleType = AS_TYPE(TTupleType, type);
  207. for (ui32 i = 0, e = tupleType->GetElementsCount(); i < e; ++i) {
  208. writer.OnListItem();
  209. WriteYsonValueImpl(writer, value.GetElement(i), tupleType->GetElementType(i), nullptr);
  210. }
  211. writer.OnEndList();
  212. return;
  213. }
  214. case TType::EKind::Variant:
  215. {
  216. writer.OnBeginList();
  217. auto underlyingType = AS_TYPE(TVariantType, type)->GetUnderlyingType();
  218. writer.OnListItem();
  219. auto index = value.GetVariantIndex();
  220. writer.OnUint64Scalar(index);
  221. writer.OnListItem();
  222. if (underlyingType->IsTuple()) {
  223. WriteYsonValueImpl(writer, value.GetVariantItem(), AS_TYPE(TTupleType, underlyingType)->GetElementType(index), nullptr);
  224. } else {
  225. WriteYsonValueImpl(writer, value.GetVariantItem(), AS_TYPE(TStructType, underlyingType)->GetMemberType(index), nullptr);
  226. }
  227. writer.OnEndList();
  228. return;
  229. }
  230. case TType::EKind::Tagged:
  231. {
  232. auto underlyingType = AS_TYPE(TTaggedType, type)->GetBaseType();
  233. WriteYsonValueImpl(writer, value, underlyingType, structPositions);
  234. return;
  235. }
  236. default:
  237. YQL_ENSURE(false, "unknown type " << type->GetKindAsStr());
  238. }
  239. }
  240. void WriteYsonValue(NYson::TYsonConsumerBase& writer, const NUdf::TUnboxedValuePod& value, TType* type,
  241. const TVector<ui32>* structPositions)
  242. {
  243. NResult::TYsonResultWriter resultWriter(writer);
  244. WriteYsonValueImpl(resultWriter, value, type, structPositions);
  245. }
  246. TString WriteYsonValue(const NUdf::TUnboxedValuePod& value, TType* type, const TVector<ui32>* structPositions,
  247. NYson::EYsonFormat format) {
  248. TStringStream str;
  249. NYson::TYsonWriter writer(&str, format);
  250. WriteYsonValue(writer, value, type, structPositions);
  251. return str.Str();
  252. }
  253. TCodecContext::TCodecContext(
  254. const TTypeEnvironment& env,
  255. const IFunctionRegistry& functionRegistry,
  256. const NKikimr::NMiniKQL::THolderFactory* holderFactory /* = nullptr */
  257. )
  258. : Env(env)
  259. , Builder(Env, functionRegistry)
  260. , HolderFactory(holderFactory)
  261. {
  262. }
  263. TMaybe<TVector<ui32>> CreateStructPositions(TType* inputType, const TVector<TString>* columns) {
  264. if (inputType->GetKind() != TType::EKind::Struct) {
  265. return Nothing();
  266. }
  267. auto inputStruct = AS_TYPE(TStructType, inputType);
  268. TMap<TStringBuf, ui32> members;
  269. TVector<ui32> structPositions(inputStruct->GetMembersCount(), Max<ui32>());
  270. for (ui32 i = 0; i < inputStruct->GetMembersCount(); ++i) {
  271. if (columns) {
  272. members.insert(std::make_pair(inputStruct->GetMemberName(i), i));
  273. } else {
  274. structPositions[i] = i;
  275. }
  276. }
  277. if (columns) {
  278. TColumnOrder order(*columns);
  279. ui32 pos = 0;
  280. for (auto& [column, gen_column]: order) {
  281. const ui32* idx = members.FindPtr(gen_column);
  282. YQL_ENSURE(idx, "Unknown member: " << gen_column);
  283. structPositions[pos] = *idx;
  284. ++pos;
  285. }
  286. }
  287. return structPositions;
  288. }
  289. namespace {
  290. NYT::TNode DataValueToNode(const NKikimr::NUdf::TUnboxedValuePod& value, NKikimr::NMiniKQL::TType* type) {
  291. YQL_ENSURE(type->GetKind() == TType::EKind::Data);
  292. auto dataType = AS_TYPE(TDataType, type);
  293. switch (dataType->GetSchemeType()) {
  294. case NUdf::TDataType<i32>::Id:
  295. return NYT::TNode(value.Get<i32>());
  296. case NUdf::TDataType<i64>::Id:
  297. return NYT::TNode(value.Get<i64>());
  298. case NUdf::TDataType<ui32>::Id:
  299. return NYT::TNode(value.Get<ui32>());
  300. case NUdf::TDataType<ui64>::Id:
  301. return NYT::TNode(value.Get<ui64>());
  302. case NUdf::TDataType<float>::Id:
  303. return NYT::TNode(value.Get<float>());
  304. case NUdf::TDataType<double>::Id:
  305. return NYT::TNode(value.Get<double>());
  306. case NUdf::TDataType<bool>::Id:
  307. return NYT::TNode(value.Get<bool>());
  308. case NUdf::TDataType<ui8>::Id:
  309. return NYT::TNode((ui64)value.Get<ui8>());
  310. case NUdf::TDataType<i8>::Id:
  311. return NYT::TNode((i64)value.Get<i8>());
  312. case NUdf::TDataType<ui16>::Id:
  313. return NYT::TNode((ui64)value.Get<ui16>());
  314. case NUdf::TDataType<i16>::Id:
  315. return NYT::TNode((i64)value.Get<i16>());
  316. case NUdf::TDataType<char*>::Id:
  317. case NUdf::TDataType<NUdf::TUtf8>::Id:
  318. case NUdf::TDataType<NUdf::TJson>::Id:
  319. case NUdf::TDataType<NUdf::TUuid>::Id:
  320. return NYT::TNode(TString(value.AsStringRef()));
  321. case NUdf::TDataType<NUdf::TYson>::Id:
  322. return NYT::NodeFromYsonString(TString(value.AsStringRef()));
  323. case NUdf::TDataType<NUdf::TDate>::Id:
  324. return NYT::TNode((ui64)value.Get<ui16>());
  325. case NUdf::TDataType<NUdf::TDatetime>::Id:
  326. return NYT::TNode((ui64)value.Get<ui32>());
  327. case NUdf::TDataType<NUdf::TTimestamp>::Id:
  328. return NYT::TNode(value.Get<ui64>());
  329. case NUdf::TDataType<NUdf::TInterval>::Id:
  330. return NYT::TNode(value.Get<i64>());
  331. case NUdf::TDataType<NUdf::TTzDate>::Id: {
  332. TStringStream out;
  333. out << value.Get<ui16>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  334. return NYT::TNode(out.Str());
  335. }
  336. case NUdf::TDataType<NUdf::TTzDatetime>::Id: {
  337. TStringStream out;
  338. out << value.Get<ui32>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  339. return NYT::TNode(out.Str());
  340. }
  341. case NUdf::TDataType<NUdf::TTzTimestamp>::Id: {
  342. TStringStream out;
  343. out << value.Get<ui64>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  344. return NYT::TNode(out.Str());
  345. }
  346. case NUdf::TDataType<NUdf::TDate32>::Id:
  347. return NYT::TNode((i64)value.Get<i32>());
  348. case NUdf::TDataType<NUdf::TDatetime64>::Id:
  349. return NYT::TNode(value.Get<i64>());
  350. case NUdf::TDataType<NUdf::TTimestamp64>::Id:
  351. return NYT::TNode(value.Get<i64>());
  352. case NUdf::TDataType<NUdf::TInterval64>::Id:
  353. return NYT::TNode(value.Get<i64>());
  354. case NUdf::TDataType<NUdf::TDecimal>::Id: {
  355. const auto params = static_cast<NKikimr::NMiniKQL::TDataDecimalType*>(type)->GetParams();
  356. return NYT::TNode(NDecimal::ToString(value.GetInt128(), params.first, params.second));
  357. }
  358. case NUdf::TDataType<NUdf::TJsonDocument>::Id: {
  359. NUdf::TUnboxedValue json = ValueToString(EDataSlot::JsonDocument, value);
  360. return NYT::TNode(ToString(TStringBuf(value.AsStringRef())));
  361. }
  362. case NUdf::TDataType<NUdf::TTzDate32>::Id: {
  363. TStringStream out;
  364. out << value.Get<i32>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  365. return NYT::TNode(out.Str());
  366. }
  367. case NUdf::TDataType<NUdf::TTzDatetime64>::Id: {
  368. TStringStream out;
  369. out << value.Get<i64>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  370. return NYT::TNode(out.Str());
  371. }
  372. case NUdf::TDataType<NUdf::TTzTimestamp64>::Id: {
  373. TStringStream out;
  374. out << value.Get<i64>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  375. return NYT::TNode(out.Str());
  376. }
  377. }
  378. YQL_ENSURE(false, "Unsupported type: " << static_cast<int>(dataType->GetSchemeType()));
  379. }
  380. TExprNode::TPtr DataNodeToExprLiteral(TPositionHandle pos, const TTypeAnnotationNode& type, const NYT::TNode& node, TExprContext& ctx) {
  381. YQL_ENSURE(type.GetKind() == ETypeAnnotationKind::Data, "Expecting data type, got: " << type);
  382. TString strData;
  383. if (type.Cast<TDataExprType>()->GetSlot() == EDataSlot::Yson) {
  384. strData = NYT::NodeToYsonString(node);
  385. } else {
  386. switch (node.GetType()) {
  387. case NYT::TNode::String:
  388. strData = node.AsString();
  389. break;
  390. case NYT::TNode::Int64:
  391. strData = ToString(node.AsInt64());
  392. break;
  393. case NYT::TNode::Uint64:
  394. strData = ToString(node.AsUint64());
  395. break;
  396. case NYT::TNode::Double:
  397. strData = FloatToString(node.AsDouble());
  398. break;
  399. case NYT::TNode::Bool:
  400. strData = ToString(node.AsBool());
  401. break;
  402. default:
  403. YQL_ENSURE(false, "Unexpected Yson type: " << node.GetType() << " while deserializing literal of type " << type);
  404. }
  405. }
  406. return ctx.Builder(pos)
  407. .Callable(type.Cast<TDataExprType>()->GetName())
  408. .Do([&](TExprNodeBuilder& parent) -> TExprNodeBuilder& {
  409. parent.Atom(0, strData);
  410. if (IsDataTypeDecimal(type.Cast<TDataExprType>()->GetSlot())) {
  411. auto decimalType = type.Cast<TDataExprParamsType>();
  412. parent.Atom(1, decimalType->GetParamOne());
  413. parent.Atom(2, decimalType->GetParamTwo());
  414. }
  415. return parent;
  416. })
  417. .Seal()
  418. .Build();
  419. }
  420. TString DataValueToString(const NKikimr::NUdf::TUnboxedValuePod& value, const TDataExprType* type) {
  421. switch (type->GetSlot()) {
  422. case NUdf::EDataSlot::Int32:
  423. case NUdf::EDataSlot::Date32:
  424. return ToString(value.Get<i32>());
  425. case NUdf::EDataSlot::Int64:
  426. case NUdf::EDataSlot::Interval:
  427. case NUdf::EDataSlot::Datetime64:
  428. case NUdf::EDataSlot::Timestamp64:
  429. case NUdf::EDataSlot::Interval64:
  430. return ToString(value.Get<i64>());
  431. case NUdf::EDataSlot::Uint32:
  432. case NUdf::EDataSlot::Datetime:
  433. return ToString(value.Get<ui32>());
  434. case NUdf::EDataSlot::Uint64:
  435. case NUdf::EDataSlot::Timestamp:
  436. return ToString(value.Get<ui64>());
  437. case NUdf::EDataSlot::Float:
  438. return ::FloatToString(value.Get<float>());
  439. case NUdf::EDataSlot::Double:
  440. return ::FloatToString(value.Get<double>());
  441. case NUdf::EDataSlot::Bool:
  442. return ToString(value.Get<bool>());
  443. case NUdf::EDataSlot::Uint8:
  444. return ToString(static_cast<unsigned int>(value.Get<ui8>()));
  445. case NUdf::EDataSlot::Int8:
  446. return ToString(static_cast<int>(value.Get<i8>()));
  447. case NUdf::EDataSlot::Uint16:
  448. case NUdf::EDataSlot::Date:
  449. return ToString(static_cast<unsigned int>(value.Get<ui16>()));
  450. case NUdf::EDataSlot::Int16:
  451. return ToString(static_cast<int>(value.Get<i16>()));
  452. case NUdf::EDataSlot::String:
  453. case NUdf::EDataSlot::Utf8:
  454. case NUdf::EDataSlot::Json:
  455. case NUdf::EDataSlot::Uuid:
  456. case NUdf::EDataSlot::Yson:
  457. case NUdf::EDataSlot::DyNumber:
  458. return ToString((TStringBuf)value.AsStringRef());
  459. case NUdf::EDataSlot::Decimal:
  460. {
  461. const auto params = dynamic_cast<const TDataExprParamsType*>(type);
  462. YQL_ENSURE(params, "Unable to cast decimal params");
  463. return NDecimal::ToString(value.GetInt128(), FromString<ui8>(params->GetParamOne()), FromString<ui8>(params->GetParamTwo()));
  464. }
  465. case NUdf::EDataSlot::TzDate: {
  466. TStringStream out;
  467. out << value.Get<ui16>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  468. return out.Str();
  469. }
  470. case NUdf::EDataSlot::TzDatetime: {
  471. TStringStream out;
  472. out << value.Get<ui32>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  473. return out.Str();
  474. }
  475. case NUdf::EDataSlot::TzTimestamp: {
  476. TStringStream out;
  477. out << value.Get<ui64>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  478. return out.Str();
  479. }
  480. case NUdf::EDataSlot::TzDate32: {
  481. TStringStream out;
  482. out << value.Get<i32>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  483. return out.Str();
  484. }
  485. case NUdf::EDataSlot::TzDatetime64: {
  486. TStringStream out;
  487. out << value.Get<i64>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  488. return out.Str();
  489. }
  490. case NUdf::EDataSlot::TzTimestamp64: {
  491. TStringStream out;
  492. out << value.Get<i64>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  493. return out.Str();
  494. }
  495. case NUdf::EDataSlot::JsonDocument: {
  496. NUdf::TUnboxedValue json = ValueToString(EDataSlot::JsonDocument, value);
  497. return ToString(TStringBuf(value.AsStringRef()));
  498. }
  499. }
  500. Y_ABORT("Unexpected");
  501. }
  502. } //namespace
  503. NYT::TNode ValueToNode(const NKikimr::NUdf::TUnboxedValuePod& value, NKikimr::NMiniKQL::TType* type) {
  504. NYT::TNode result;
  505. switch (type->GetKind()) {
  506. case TType::EKind::Optional: {
  507. result = NYT::TNode::CreateList();
  508. if (value) {
  509. result.Add(ValueToNode(value.GetOptionalValue(), AS_TYPE(TOptionalType, type)->GetItemType()));
  510. }
  511. break;
  512. }
  513. case TType::EKind::Tuple: {
  514. auto tupleType = AS_TYPE(TTupleType, type);
  515. result = NYT::TNode::CreateList();
  516. for (ui32 i = 0; i < tupleType->GetElementsCount(); ++i) {
  517. result.Add(ValueToNode(value.GetElement(i), tupleType->GetElementType(i)));
  518. }
  519. break;
  520. }
  521. case TType::EKind::List: {
  522. auto listType = AS_TYPE(TListType, type);
  523. result = NYT::TNode::CreateList();
  524. const auto iter = value.GetListIterator();
  525. for (NUdf::TUnboxedValue item; iter.Next(item); ) {
  526. result.Add(ValueToNode(item, listType->GetItemType()));
  527. }
  528. break;
  529. }
  530. default: {
  531. result = DataValueToNode(value, type);
  532. }
  533. }
  534. return result;
  535. }
  536. TExprNode::TPtr NodeToExprLiteral(TPositionHandle pos, const TTypeAnnotationNode& type, const NYT::TNode& node, TExprContext& ctx) {
  537. TExprNode::TPtr result;
  538. switch(type.GetKind()) {
  539. case ETypeAnnotationKind::Optional: {
  540. YQL_ENSURE(node.IsList() || node.IsNull());
  541. if (node.IsNull() || node.AsList().empty()) {
  542. return ctx.NewCallable(pos, "Nothing", { ExpandType(pos, type, ctx) });
  543. }
  544. YQL_ENSURE(node.AsList().size() == 1);
  545. result = ctx.NewCallable(pos, "Just", {
  546. NodeToExprLiteral(pos, *type.Cast<TOptionalExprType>()->GetItemType(), node.AsList().front(), ctx)
  547. });
  548. break;
  549. }
  550. case ETypeAnnotationKind::Tuple: {
  551. YQL_ENSURE(node.IsList());
  552. const TTypeAnnotationNode::TListType& itemTypes = type.Cast<TTupleExprType>()->GetItems();
  553. const auto& items = node.AsList();
  554. YQL_ENSURE(itemTypes.size() == items.size());
  555. TExprNodeList resultNodes;
  556. for (size_t i = 0; i < items.size(); ++i) {
  557. resultNodes.push_back(NodeToExprLiteral(pos, *itemTypes[i], items[i], ctx));
  558. }
  559. result = ctx.NewList(pos, std::move(resultNodes));
  560. break;
  561. }
  562. case ETypeAnnotationKind::List: {
  563. YQL_ENSURE(node.IsList());
  564. const TTypeAnnotationNode& itemType = *type.Cast<TListExprType>()->GetItemType();
  565. if (node.AsList().empty()) {
  566. return ctx.NewCallable(pos, "List", { ExpandType(pos, *ctx.MakeType<TListExprType>(&itemType), ctx) });
  567. }
  568. TExprNodeList children;
  569. for (auto& child : node.AsList()) {
  570. children.push_back(NodeToExprLiteral(pos, itemType, child, ctx));
  571. }
  572. result = ctx.NewCallable(pos, "AsList", std::move(children));
  573. break;
  574. }
  575. default: {
  576. result = DataNodeToExprLiteral(pos, type, node, ctx);
  577. }
  578. }
  579. return result;
  580. }
  581. void CopyYsonWithAttrs(char cmd, TInputBuf& buf, TVector<char>& yson) {
  582. if (cmd == BeginAttributesSymbol) {
  583. yson.push_back(cmd);
  584. cmd = buf.Read();
  585. for (;;) {
  586. if (cmd == EndAttributesSymbol) {
  587. yson.push_back(cmd);
  588. cmd = buf.Read();
  589. break;
  590. }
  591. CHECK_EXPECTED(cmd, StringMarker);
  592. yson.push_back(cmd);
  593. i32 length = buf.CopyVarI32(yson);
  594. CHECK_STRING_LENGTH(length);
  595. buf.CopyMany(length, yson);
  596. EXPECTED_COPY(buf, KeyValueSeparatorSymbol, yson);
  597. cmd = buf.Read();
  598. CopyYsonWithAttrs(cmd, buf, yson);
  599. cmd = buf.Read();
  600. if (cmd == KeyedItemSeparatorSymbol) {
  601. yson.push_back(cmd);
  602. cmd = buf.Read();
  603. }
  604. }
  605. }
  606. CopyYson(cmd, buf, yson);
  607. }
  608. void CopyYson(char cmd, TInputBuf& buf, TVector<char>& yson) {
  609. switch (cmd) {
  610. case EntitySymbol:
  611. case TrueMarker:
  612. case FalseMarker:
  613. yson.push_back(cmd);
  614. break;
  615. case Int64Marker:
  616. yson.push_back(cmd);
  617. buf.CopyVarI64(yson);
  618. break;
  619. case Uint64Marker:
  620. yson.push_back(cmd);
  621. buf.CopyVarUI64(yson);
  622. break;
  623. case DoubleMarker:
  624. yson.push_back(cmd);
  625. buf.CopyMany(8, yson);
  626. break;
  627. case StringMarker: {
  628. yson.push_back(cmd);
  629. i32 length = buf.CopyVarI32(yson);
  630. CHECK_STRING_LENGTH(length);
  631. buf.CopyMany(length, yson);
  632. break;
  633. }
  634. case BeginListSymbol: {
  635. yson.push_back(cmd);
  636. cmd = buf.Read();
  637. for (;;) {
  638. if (cmd == EndListSymbol) {
  639. yson.push_back(cmd);
  640. break;
  641. }
  642. CopyYsonWithAttrs(cmd, buf, yson);
  643. cmd = buf.Read();
  644. if (cmd == ListItemSeparatorSymbol) {
  645. yson.push_back(cmd);
  646. cmd = buf.Read();
  647. }
  648. }
  649. break;
  650. }
  651. case BeginMapSymbol: {
  652. yson.push_back(cmd);
  653. cmd = buf.Read();
  654. for (;;) {
  655. if (cmd == EndMapSymbol) {
  656. yson.push_back(cmd);
  657. break;
  658. }
  659. CHECK_EXPECTED(cmd, StringMarker);
  660. yson.push_back(cmd);
  661. i32 length = buf.CopyVarI32(yson);
  662. CHECK_STRING_LENGTH(length);
  663. buf.CopyMany(length, yson);
  664. EXPECTED_COPY(buf, KeyValueSeparatorSymbol, yson);
  665. cmd = buf.Read();
  666. CopyYsonWithAttrs(cmd, buf, yson);
  667. cmd = buf.Read();
  668. if (cmd == KeyedItemSeparatorSymbol) {
  669. yson.push_back(cmd);
  670. cmd = buf.Read();
  671. }
  672. }
  673. break;
  674. }
  675. default:
  676. YQL_ENSURE(false, "Unexpected yson character: " << cmd);
  677. }
  678. }
  679. void SkipYson(char cmd, TInputBuf& buf) {
  680. auto& yson = buf.YsonBuffer();
  681. yson.clear();
  682. CopyYsonWithAttrs(cmd, buf, yson);
  683. }
  684. NUdf::TUnboxedValue ReadYsonStringInResultFormat(char cmd, TInputBuf& buf) {
  685. NUdf::TUnboxedValue result;
  686. const bool needDecode = (cmd == BeginListSymbol);
  687. if (needDecode) {
  688. cmd = buf.Read();
  689. }
  690. CHECK_EXPECTED(cmd, StringMarker);
  691. const i32 length = buf.ReadVarI32();
  692. CHECK_STRING_LENGTH(length);
  693. TTempBuf tmpBuf(length);
  694. buf.ReadMany(tmpBuf.Data(), length);
  695. if (needDecode) {
  696. TString decoded = Base64Decode(TStringBuf(tmpBuf.Data(), length));
  697. result = NUdf::TUnboxedValue(MakeString(NUdf::TStringRef(decoded)));
  698. } else {
  699. result = NUdf::TUnboxedValue(MakeString(NUdf::TStringRef(tmpBuf.Data(), length)));
  700. }
  701. if (needDecode) {
  702. cmd = buf.Read();
  703. if (cmd == ListItemSeparatorSymbol) {
  704. cmd = buf.Read();
  705. }
  706. CHECK_EXPECTED(cmd, EndListSymbol);
  707. }
  708. return result;
  709. }
  710. TStringBuf ReadNextString(char cmd, TInputBuf& buf) {
  711. CHECK_EXPECTED(cmd, StringMarker);
  712. return buf.ReadYtString();
  713. }
  714. template <typename T>
  715. T ReadNextSerializedNumber(char cmd, TInputBuf& buf) {
  716. auto nextString = ReadNextString(cmd, buf);
  717. if constexpr (!std::numeric_limits<T>::is_integer) {
  718. if (nextString == "inf" || nextString == "+inf") {
  719. return std::numeric_limits<T>::infinity();
  720. } else if (nextString == "-inf") {
  721. return -std::numeric_limits<T>::infinity();
  722. } else if (nextString == "nan") {
  723. return std::numeric_limits<T>::quiet_NaN();
  724. }
  725. }
  726. return FromString<T>(nextString);
  727. }
  728. template <typename T>
  729. T ReadYsonFloatNumber(char cmd, TInputBuf& buf) {
  730. return ReadNextSerializedNumber<T>(cmd, buf);
  731. }
  732. NUdf::TUnboxedValue ReadYsonValue(TType* type,
  733. const NKikimr::NMiniKQL::THolderFactory& holderFactory, char cmd, TInputBuf& buf) {
  734. switch (type->GetKind()) {
  735. case TType::EKind::Variant: {
  736. auto varType = static_cast<TVariantType*>(type);
  737. auto underlyingType = varType->GetUnderlyingType();
  738. if (cmd == StringMarker) {
  739. YQL_ENSURE(underlyingType->IsStruct(), "Expected struct as underlying type");
  740. auto name = ReadNextString(cmd, buf);
  741. auto index = static_cast<TStructType*>(underlyingType)->FindMemberIndex(name);
  742. YQL_ENSURE(index, "Unexpected member: " << name);
  743. YQL_ENSURE(static_cast<TStructType*>(underlyingType)->GetMemberType(*index)->IsVoid(), "Expected Void as underlying type");
  744. return holderFactory.CreateVariantHolder(NUdf::TUnboxedValuePod::Zero(), *index);
  745. }
  746. CHECK_EXPECTED(cmd, BeginListSymbol);
  747. cmd = buf.Read();
  748. i64 index = 0;
  749. if (cmd == BeginListSymbol) {
  750. cmd = buf.Read();
  751. YQL_ENSURE(underlyingType->IsStruct(), "Expected struct as underlying type");
  752. auto name = ReadNextString(cmd, buf);
  753. auto foundIndex = static_cast<TStructType*>(underlyingType)->FindMemberIndex(name);
  754. YQL_ENSURE(foundIndex, "Unexpected member: " << name);
  755. index = *foundIndex;
  756. cmd = buf.Read();
  757. if (cmd == ListItemSeparatorSymbol) {
  758. cmd = buf.Read();
  759. }
  760. CHECK_EXPECTED(cmd, EndListSymbol);
  761. } else {
  762. index = ReadNextSerializedNumber<ui64>(cmd, buf);
  763. }
  764. YQL_ENSURE(index < varType->GetAlternativesCount(), "Bad variant alternative: " << index << ", only " <<
  765. varType->GetAlternativesCount() << " are available");
  766. YQL_ENSURE(underlyingType->IsTuple() || underlyingType->IsStruct(), "Wrong underlying type");
  767. TType* itemType;
  768. if (underlyingType->IsTuple()) {
  769. itemType = static_cast<TTupleType*>(underlyingType)->GetElementType(index);
  770. }
  771. else {
  772. itemType = static_cast<TStructType*>(underlyingType)->GetMemberType(index);
  773. }
  774. EXPECTED(buf, ListItemSeparatorSymbol);
  775. cmd = buf.Read();
  776. auto value = ReadYsonValue(itemType, holderFactory, cmd, buf);
  777. cmd = buf.Read();
  778. if (cmd == ListItemSeparatorSymbol) {
  779. cmd = buf.Read();
  780. }
  781. CHECK_EXPECTED(cmd, EndListSymbol);
  782. return holderFactory.CreateVariantHolder(value.Release(), index);
  783. }
  784. case TType::EKind::Data: {
  785. auto schemeType = static_cast<TDataType*>(type)->GetSchemeType();
  786. switch (schemeType) {
  787. case NUdf::TDataType<bool>::Id:
  788. YQL_ENSURE(cmd == FalseMarker || cmd == TrueMarker, "Expected either true or false, but got: " << TString(cmd).Quote());
  789. return NUdf::TUnboxedValuePod(cmd == TrueMarker);
  790. case NUdf::TDataType<ui8>::Id:
  791. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<ui8>(cmd, buf));
  792. case NUdf::TDataType<i8>::Id:
  793. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<i8>(cmd, buf));
  794. case NUdf::TDataType<ui16>::Id:
  795. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<ui16>(cmd, buf));
  796. case NUdf::TDataType<i16>::Id:
  797. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<i16>(cmd, buf));
  798. case NUdf::TDataType<i32>::Id:
  799. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<i32>(cmd, buf));
  800. case NUdf::TDataType<ui32>::Id:
  801. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<ui32>(cmd, buf));
  802. case NUdf::TDataType<i64>::Id:
  803. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<i64>(cmd, buf));
  804. case NUdf::TDataType<ui64>::Id:
  805. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<ui64>(cmd, buf));
  806. case NUdf::TDataType<float>::Id:
  807. return NUdf::TUnboxedValuePod(ReadYsonFloatNumber<float>(cmd, buf));
  808. case NUdf::TDataType<double>::Id:
  809. return NUdf::TUnboxedValuePod(ReadYsonFloatNumber<double>(cmd, buf));
  810. case NUdf::TDataType<NUdf::TUtf8>::Id:
  811. case NUdf::TDataType<char*>::Id:
  812. case NUdf::TDataType<NUdf::TJson>::Id:
  813. case NUdf::TDataType<NUdf::TDyNumber>::Id:
  814. case NUdf::TDataType<NUdf::TUuid>::Id: {
  815. return ReadYsonStringInResultFormat(cmd, buf);
  816. }
  817. case NUdf::TDataType<NUdf::TDecimal>::Id: {
  818. auto nextString = ReadNextString(cmd, buf);
  819. const auto params = static_cast<TDataDecimalType*>(type)->GetParams();
  820. const auto val = NDecimal::FromString(nextString, params.first, params.second);
  821. YQL_ENSURE(!NDecimal::IsError(val));
  822. return NUdf::TUnboxedValuePod(val);
  823. }
  824. case NUdf::TDataType<NUdf::TYson>::Id: {
  825. auto& yson = buf.YsonBuffer();
  826. yson.clear();
  827. CopyYsonWithAttrs(cmd, buf, yson);
  828. TString decodedYson = NResult::DecodeRestrictedYson(TStringBuf(yson.data(), yson.size()), NYson::EYsonFormat::Text);
  829. return NUdf::TUnboxedValue(MakeString(NUdf::TStringRef(decodedYson)));
  830. }
  831. case NUdf::TDataType<NUdf::TDate>::Id:
  832. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<ui16>(cmd, buf));
  833. case NUdf::TDataType<NUdf::TDatetime>::Id:
  834. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<ui32>(cmd, buf));
  835. case NUdf::TDataType<NUdf::TTimestamp>::Id:
  836. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<ui64>(cmd, buf));
  837. case NUdf::TDataType<NUdf::TInterval>::Id:
  838. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<i64>(cmd, buf));
  839. case NUdf::TDataType<NUdf::TTzDate>::Id: {
  840. auto nextString = ReadNextString(cmd, buf);
  841. NUdf::TUnboxedValuePod data;
  842. data = ValueFromString(NUdf::EDataSlot::TzDate, nextString);
  843. YQL_ENSURE(data, "incorrect tz date format for value " << nextString);
  844. return data;
  845. }
  846. case NUdf::TDataType<NUdf::TTzDatetime>::Id: {
  847. auto nextString = ReadNextString(cmd, buf);
  848. NUdf::TUnboxedValuePod data;
  849. data = ValueFromString(NUdf::EDataSlot::TzDatetime, nextString);
  850. YQL_ENSURE(data, "incorrect tz datetime format for value " << nextString);
  851. return data;
  852. }
  853. case NUdf::TDataType<NUdf::TTzTimestamp>::Id: {
  854. auto nextString = ReadNextString(cmd, buf);
  855. NUdf::TUnboxedValuePod data;
  856. data = ValueFromString(NUdf::EDataSlot::TzTimestamp, nextString);
  857. YQL_ENSURE(data, "incorrect tz timestamp format for value " << nextString);
  858. return data;
  859. }
  860. case NUdf::TDataType<NUdf::TDate32>::Id:
  861. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<i32>(cmd, buf));
  862. case NUdf::TDataType<NUdf::TDatetime64>::Id:
  863. case NUdf::TDataType<NUdf::TTimestamp64>::Id:
  864. case NUdf::TDataType<NUdf::TInterval64>::Id:
  865. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<i64>(cmd, buf));
  866. case NUdf::TDataType<NUdf::TJsonDocument>::Id: {
  867. const auto json = ReadYsonStringInResultFormat(cmd, buf);
  868. return ValueFromString(EDataSlot::JsonDocument, json.AsStringRef());
  869. }
  870. case NUdf::TDataType<NUdf::TTzDate32>::Id: {
  871. auto nextString = ReadNextString(cmd, buf);
  872. NUdf::TUnboxedValuePod data;
  873. data = ValueFromString(NUdf::EDataSlot::TzDate32, nextString);
  874. YQL_ENSURE(data, "incorrect tz date format for value " << nextString);
  875. return data;
  876. }
  877. case NUdf::TDataType<NUdf::TTzDatetime64>::Id: {
  878. auto nextString = ReadNextString(cmd, buf);
  879. NUdf::TUnboxedValuePod data;
  880. data = ValueFromString(NUdf::EDataSlot::TzDatetime64, nextString);
  881. YQL_ENSURE(data, "incorrect tz datetime format for value " << nextString);
  882. return data;
  883. }
  884. case NUdf::TDataType<NUdf::TTzTimestamp64>::Id: {
  885. auto nextString = ReadNextString(cmd, buf);
  886. NUdf::TUnboxedValuePod data;
  887. data = ValueFromString(NUdf::EDataSlot::TzTimestamp64, nextString);
  888. YQL_ENSURE(data, "incorrect tz timestamp format for value " << nextString);
  889. return data;
  890. }
  891. default:
  892. YQL_ENSURE(false, "Unsupported data type: " << schemeType);
  893. }
  894. }
  895. case TType::EKind::Struct: {
  896. YQL_ENSURE(cmd == BeginListSymbol || cmd == BeginMapSymbol);
  897. auto structType = static_cast<TStructType*>(type);
  898. NUdf::TUnboxedValue* items;
  899. NUdf::TUnboxedValue ret = holderFactory.CreateDirectArrayHolder(structType->GetMembersCount(), items);
  900. if (cmd == BeginListSymbol) {
  901. cmd = buf.Read();
  902. for (ui32 i = 0; i < structType->GetMembersCount(); ++i) {
  903. items[i] = ReadYsonValue(structType->GetMemberType(i), holderFactory, cmd, buf);
  904. cmd = buf.Read();
  905. if (cmd == ListItemSeparatorSymbol) {
  906. cmd = buf.Read();
  907. }
  908. }
  909. CHECK_EXPECTED(cmd, EndListSymbol);
  910. return ret;
  911. } else {
  912. cmd = buf.Read();
  913. for (;;) {
  914. if (cmd == EndMapSymbol) {
  915. break;
  916. }
  917. auto keyBuffer = ReadNextString(cmd, buf);
  918. auto pos = structType->FindMemberIndex(keyBuffer);
  919. EXPECTED(buf, KeyValueSeparatorSymbol);
  920. cmd = buf.Read();
  921. if (pos && cmd != '#') {
  922. auto memberType = structType->GetMemberType(*pos);
  923. auto unwrappedType = memberType;
  924. items[*pos] = ReadYsonValue(unwrappedType, holderFactory, cmd, buf);
  925. } else {
  926. SkipYson(cmd, buf);
  927. }
  928. cmd = buf.Read();
  929. if (cmd == KeyedItemSeparatorSymbol) {
  930. cmd = buf.Read();
  931. }
  932. }
  933. for (ui32 i = 0; i < structType->GetMembersCount(); ++i) {
  934. if (items[i]) {
  935. continue;
  936. }
  937. YQL_ENSURE(structType->GetMemberType(i)->IsOptional(), "Missing required field: " << structType->GetMemberName(i));
  938. }
  939. return ret;
  940. }
  941. }
  942. case TType::EKind::List: {
  943. auto itemType = static_cast<TListType*>(type)->GetItemType();
  944. TDefaultListRepresentation items;
  945. CHECK_EXPECTED(cmd, BeginListSymbol);
  946. cmd = buf.Read();
  947. for (;;) {
  948. if (cmd == EndListSymbol) {
  949. break;
  950. }
  951. items = items.Append(ReadYsonValue(itemType, holderFactory, cmd, buf));
  952. cmd = buf.Read();
  953. if (cmd == ListItemSeparatorSymbol) {
  954. cmd = buf.Read();
  955. }
  956. }
  957. return holderFactory.CreateDirectListHolder(std::move(items));
  958. }
  959. case TType::EKind::Optional: {
  960. if (cmd == EntitySymbol) {
  961. return NUdf::TUnboxedValuePod();
  962. }
  963. auto itemType = static_cast<TOptionalType*>(type)->GetItemType();
  964. if (cmd != BeginListSymbol) {
  965. auto value = ReadYsonValue(itemType, holderFactory, cmd, buf);
  966. return value.Release().MakeOptional();
  967. }
  968. cmd = buf.Read();
  969. if (cmd == EndListSymbol) {
  970. return NUdf::TUnboxedValuePod();
  971. }
  972. auto value = ReadYsonValue(itemType, holderFactory, cmd, buf);
  973. cmd = buf.Read();
  974. if (cmd == ListItemSeparatorSymbol) {
  975. cmd = buf.Read();
  976. }
  977. CHECK_EXPECTED(cmd, EndListSymbol);
  978. return value.Release().MakeOptional();
  979. }
  980. case TType::EKind::Dict: {
  981. auto dictType = static_cast<TDictType*>(type);
  982. auto keyType = dictType->GetKeyType();
  983. auto payloadType = dictType->GetPayloadType();
  984. TKeyTypes types;
  985. bool isTuple;
  986. bool encoded;
  987. bool useIHash;
  988. GetDictionaryKeyTypes(keyType, types, isTuple, encoded, useIHash);
  989. TMaybe<TValuePacker> packer;
  990. if (encoded) {
  991. packer.ConstructInPlace(true, keyType);
  992. }
  993. YQL_ENSURE(cmd == BeginListSymbol || cmd == BeginMapSymbol, "Expected '{' or '[', but read: " << TString(cmd).Quote());
  994. if (cmd == BeginMapSymbol) {
  995. bool unusedIsOptional;
  996. auto unpackedType = UnpackOptional(keyType, unusedIsOptional);
  997. YQL_ENSURE(unpackedType->IsData() &&
  998. (static_cast<TDataType*>(unpackedType)->GetSchemeType() == NUdf::TDataType<char*>::Id ||
  999. static_cast<TDataType*>(unpackedType)->GetSchemeType() == NUdf::TDataType<NUdf::TUtf8>::Id),
  1000. "Expected String or Utf8 type as dictionary key type");
  1001. auto filler = [&](TValuesDictHashMap& map) {
  1002. cmd = buf.Read();
  1003. for (;;) {
  1004. if (cmd == EndMapSymbol) {
  1005. break;
  1006. }
  1007. auto keyBuffer = ReadNextString(cmd, buf);
  1008. auto keyStr = NUdf::TUnboxedValue(MakeString(keyBuffer));
  1009. EXPECTED(buf, KeyValueSeparatorSymbol);
  1010. cmd = buf.Read();
  1011. auto payload = ReadYsonValue(payloadType, holderFactory, cmd, buf);
  1012. map.emplace(std::move(keyStr), std::move(payload));
  1013. cmd = buf.Read();
  1014. if (cmd == KeyedItemSeparatorSymbol) {
  1015. cmd = buf.Read();
  1016. }
  1017. }
  1018. };
  1019. const NUdf::IHash* hash = holderFactory.GetHash(*keyType, useIHash);
  1020. const NUdf::IEquate* equate = holderFactory.GetEquate(*keyType, useIHash);
  1021. return holderFactory.CreateDirectHashedDictHolder(filler, types, isTuple, true, nullptr, hash, equate);
  1022. }
  1023. else {
  1024. auto filler = [&](TValuesDictHashMap& map) {
  1025. cmd = buf.Read();
  1026. for (;;) {
  1027. if (cmd == EndListSymbol) {
  1028. break;
  1029. }
  1030. CHECK_EXPECTED(cmd, BeginListSymbol);
  1031. cmd = buf.Read();
  1032. auto key = ReadYsonValue(keyType, holderFactory, cmd, buf);
  1033. EXPECTED(buf, ListItemSeparatorSymbol);
  1034. cmd = buf.Read();
  1035. auto payload = ReadYsonValue(payloadType, holderFactory, cmd, buf);
  1036. cmd = buf.Read();
  1037. if (cmd == ListItemSeparatorSymbol) {
  1038. cmd = buf.Read();
  1039. }
  1040. CHECK_EXPECTED(cmd, EndListSymbol);
  1041. if (packer) {
  1042. key = MakeString(packer->Pack(key));
  1043. }
  1044. map.emplace(std::move(key), std::move(payload));
  1045. cmd = buf.Read();
  1046. if (cmd == ListItemSeparatorSymbol) {
  1047. cmd = buf.Read();
  1048. }
  1049. }
  1050. };
  1051. const NUdf::IHash* hash = holderFactory.GetHash(*keyType, useIHash);
  1052. const NUdf::IEquate* equate = holderFactory.GetEquate(*keyType, useIHash);
  1053. return holderFactory.CreateDirectHashedDictHolder(filler, types, isTuple, true, encoded ? keyType : nullptr,
  1054. hash, equate);
  1055. }
  1056. }
  1057. case TType::EKind::Tuple: {
  1058. auto tupleType = static_cast<TTupleType*>(type);
  1059. NUdf::TUnboxedValue* items;
  1060. NUdf::TUnboxedValue ret = holderFactory.CreateDirectArrayHolder(tupleType->GetElementsCount(), items);
  1061. CHECK_EXPECTED(cmd, BeginListSymbol);
  1062. cmd = buf.Read();
  1063. for (ui32 i = 0; i < tupleType->GetElementsCount(); ++i) {
  1064. items[i] = ReadYsonValue(tupleType->GetElementType(i), holderFactory, cmd, buf);
  1065. cmd = buf.Read();
  1066. if (cmd == ListItemSeparatorSymbol) {
  1067. cmd = buf.Read();
  1068. }
  1069. }
  1070. CHECK_EXPECTED(cmd, EndListSymbol);
  1071. return ret;
  1072. }
  1073. case TType::EKind::Void: {
  1074. if (cmd == EntitySymbol) {
  1075. return NUdf::TUnboxedValuePod::Void();
  1076. }
  1077. auto nextString = ReadNextString(cmd, buf);
  1078. YQL_ENSURE(nextString == NResult::TYsonResultWriter::VoidString, "Expected Void");
  1079. return NUdf::TUnboxedValuePod::Void();
  1080. }
  1081. case TType::EKind::Null: {
  1082. CHECK_EXPECTED(cmd, EntitySymbol);
  1083. return NUdf::TUnboxedValuePod();
  1084. }
  1085. case TType::EKind::EmptyList: {
  1086. CHECK_EXPECTED(cmd, BeginListSymbol);
  1087. cmd = buf.Read();
  1088. CHECK_EXPECTED(cmd, EndListSymbol);
  1089. return holderFactory.GetEmptyContainerLazy();
  1090. }
  1091. case TType::EKind::EmptyDict: {
  1092. YQL_ENSURE(cmd == BeginListSymbol || cmd == BeginMapSymbol, "Expected '{' or '[', but read: " << TString(cmd).Quote());
  1093. if (cmd == BeginListSymbol) {
  1094. cmd = buf.Read();
  1095. CHECK_EXPECTED(cmd, EndListSymbol);
  1096. } else {
  1097. cmd = buf.Read();
  1098. CHECK_EXPECTED(cmd, EndMapSymbol);
  1099. }
  1100. return holderFactory.GetEmptyContainerLazy();
  1101. }
  1102. case TType::EKind::Pg: {
  1103. auto pgType = static_cast<TPgType*>(type);
  1104. return ReadYsonValuePg(pgType, cmd, buf);
  1105. }
  1106. case TType::EKind::Tagged: {
  1107. auto taggedType = static_cast<TTaggedType*>(type);
  1108. return ReadYsonValue(taggedType->GetBaseType(), holderFactory, cmd, buf);
  1109. }
  1110. default:
  1111. YQL_ENSURE(false, "Unsupported type: " << type->GetKindAsStr());
  1112. }
  1113. }
  1114. TMaybe<NUdf::TUnboxedValue> ParseYsonValue(const THolderFactory& holderFactory,
  1115. const TStringBuf& yson, TType* type, IOutputStream* err) {
  1116. try {
  1117. class TReader : public IBlockReader {
  1118. public:
  1119. TReader(const TStringBuf& yson)
  1120. : Yson_(yson)
  1121. {}
  1122. void SetDeadline(TInstant deadline) override {
  1123. Y_UNUSED(deadline);
  1124. }
  1125. std::pair<const char*, const char*> NextFilledBlock() override {
  1126. if (FirstBuffer_) {
  1127. FirstBuffer_ = false;
  1128. return{ Yson_.begin(), Yson_.end() };
  1129. }
  1130. else {
  1131. return{ nullptr, nullptr };
  1132. }
  1133. }
  1134. void ReturnBlock() override {
  1135. }
  1136. bool Retry(const TMaybe<ui32>& rangeIndex, const TMaybe<ui64>& rowIndex, const std::exception_ptr& error) override {
  1137. Y_UNUSED(rangeIndex);
  1138. Y_UNUSED(rowIndex);
  1139. Y_UNUSED(error);
  1140. return false;
  1141. }
  1142. private:
  1143. TStringBuf Yson_;
  1144. bool FirstBuffer_ = true;
  1145. };
  1146. TReader reader(yson);
  1147. TInputBuf buf(reader, nullptr);
  1148. char cmd = buf.Read();
  1149. return ReadYsonValue(type, holderFactory, cmd, buf);
  1150. }
  1151. catch (const yexception& e) {
  1152. if (err) {
  1153. *err << "YSON parsing failed: " << e.what();
  1154. }
  1155. return Nothing();
  1156. }
  1157. }
  1158. TMaybe<NUdf::TUnboxedValue> ParseYsonNodeInResultFormat(const THolderFactory& holderFactory,
  1159. const NYT::TNode& node, TType* type, IOutputStream* err) {
  1160. return ParseYsonValue(holderFactory, NYT::NodeToYsonString(node, NYson::EYsonFormat::Binary), type, err);
  1161. }
  1162. TExprNode::TPtr ValueToExprLiteral(const TTypeAnnotationNode* type, const NKikimr::NUdf::TUnboxedValuePod& value, TExprContext& ctx,
  1163. TPositionHandle pos) {
  1164. switch (type->GetKind()) {
  1165. case ETypeAnnotationKind::Variant: {
  1166. auto variantType = type->Cast<TVariantExprType>();
  1167. ui32 index = value.GetVariantIndex();
  1168. const TTypeAnnotationNode* itemType;
  1169. if (variantType->GetUnderlyingType()->GetKind() == ETypeAnnotationKind::Struct) {
  1170. // struct
  1171. const auto& items = variantType->GetUnderlyingType()->Cast<TStructExprType>()->GetItems();
  1172. YQL_ENSURE(index < items.size());
  1173. itemType = items[index]->GetItemType();
  1174. } else if (variantType->GetUnderlyingType()->GetKind() == ETypeAnnotationKind::Tuple) {
  1175. // tuple
  1176. const auto& items = variantType->GetUnderlyingType()->Cast<TTupleExprType>()->GetItems();
  1177. YQL_ENSURE(index < items.size());
  1178. itemType = items[index];
  1179. } else {
  1180. YQL_ENSURE(false, "Unknown underlying type");
  1181. }
  1182. return ctx.NewCallable(pos, "Variant", {
  1183. ValueToExprLiteral(itemType, value.GetVariantItem(), ctx, pos),
  1184. ctx.NewAtom(pos, variantType->GetUnderlyingType()->GetKind() == ETypeAnnotationKind::Struct ?
  1185. variantType->GetUnderlyingType()->Cast<TStructExprType>()->GetItems()[index]->GetName() : ToString(index)),
  1186. ExpandType(pos, *type, ctx)
  1187. });
  1188. }
  1189. case ETypeAnnotationKind::Data: {
  1190. auto dataType = type->Cast<TDataExprType>();
  1191. TVector<TExprNode::TPtr> args({ ctx.NewAtom(pos, DataValueToString(value, dataType)) });
  1192. if (auto params = dynamic_cast<const TDataExprParamsType*>(dataType)) {
  1193. args.reserve(3);
  1194. args.push_back(ctx.NewAtom(pos, params->GetParamOne()));
  1195. args.push_back(ctx.NewAtom(pos, params->GetParamTwo()));
  1196. }
  1197. return ctx.NewCallable(pos, dataType->GetName(), std::move(args));
  1198. }
  1199. case ETypeAnnotationKind::Struct: {
  1200. auto structType = type->Cast<TStructExprType>();
  1201. TExprNode::TListType items;
  1202. items.reserve(1 + structType->GetSize());
  1203. items.emplace_back(ExpandType(pos, *type, ctx));
  1204. for (ui32 i = 0; i < structType->GetSize(); ++i) {
  1205. auto pair = ctx.NewList(pos, {
  1206. ctx.NewAtom(pos, structType->GetItems()[i]->GetName()),
  1207. ValueToExprLiteral(structType->GetItems()[i]->GetItemType(), value.GetElement(i), ctx, pos)
  1208. });
  1209. items.emplace_back(std::move(pair));
  1210. }
  1211. return ctx.NewCallable(pos, "Struct", std::move(items));
  1212. }
  1213. case ETypeAnnotationKind::List: {
  1214. auto listType = type->Cast<TListExprType>();
  1215. auto itemType = listType->GetItemType();
  1216. TExprNode::TListType items;
  1217. items.emplace_back(ExpandType(pos, *type, ctx));
  1218. NUdf::TUnboxedValue itemValue;
  1219. for (auto iter = value.GetListIterator(); iter.Next(itemValue);) {
  1220. items.emplace_back(ValueToExprLiteral(itemType, itemValue, ctx, pos));
  1221. }
  1222. if (items.size() > 1) {
  1223. items.erase(items.begin());
  1224. return ctx.NewCallable(pos, "AsList", std::move(items));
  1225. }
  1226. return ctx.NewCallable(pos, "List", std::move(items));
  1227. }
  1228. case ETypeAnnotationKind::Optional: {
  1229. auto optionalType = type->Cast<TOptionalExprType>();
  1230. auto itemType = optionalType->GetItemType();
  1231. if (!value) {
  1232. return ctx.NewCallable(pos, "Nothing", { ExpandType(pos, *type, ctx) });
  1233. } else {
  1234. return ctx.NewCallable(pos, "Just", { ValueToExprLiteral(itemType, value.GetOptionalValue(), ctx, pos)});
  1235. }
  1236. }
  1237. case ETypeAnnotationKind::Dict: {
  1238. auto dictType = type->Cast<TDictExprType>();
  1239. auto keyType = dictType->GetKeyType();
  1240. auto payloadType = dictType->GetPayloadType();
  1241. TExprNode::TListType items;
  1242. items.emplace_back(ExpandType(pos, *type, ctx));
  1243. NUdf::TUnboxedValue keyValue, payloadValue;
  1244. for (auto iter = value.GetDictIterator(); iter.NextPair(keyValue, payloadValue);) {
  1245. auto pair = ctx.NewList(pos, {
  1246. ValueToExprLiteral(keyType, keyValue, ctx, pos),
  1247. ValueToExprLiteral(payloadType, payloadValue, ctx, pos)
  1248. });
  1249. items.emplace_back(std::move(pair));
  1250. }
  1251. return ctx.NewCallable(pos, "Dict", std::move(items));
  1252. }
  1253. case ETypeAnnotationKind::Tuple: {
  1254. auto tupleType = type->Cast<TTupleExprType>();
  1255. TExprNode::TListType items;
  1256. items.reserve(tupleType->GetSize());
  1257. for (ui32 i = 0; i < tupleType->GetSize(); ++i) {
  1258. items.emplace_back(ValueToExprLiteral(tupleType->GetItems()[i], value.GetElement(i), ctx, pos));
  1259. }
  1260. return ctx.NewList(pos, std::move(items));
  1261. }
  1262. case ETypeAnnotationKind::Void: {
  1263. return ctx.NewCallable(pos, "Void", {});
  1264. }
  1265. case ETypeAnnotationKind::Null: {
  1266. return ctx.NewCallable(pos, "Null", {});
  1267. }
  1268. case ETypeAnnotationKind::EmptyList: {
  1269. return ctx.NewCallable(pos, "AsList", {});
  1270. }
  1271. case ETypeAnnotationKind::EmptyDict: {
  1272. return ctx.NewCallable(pos, "AsDict", {});
  1273. }
  1274. case ETypeAnnotationKind::Tagged: {
  1275. auto taggedType = type->Cast<TTaggedExprType>();
  1276. auto baseType = taggedType->GetBaseType();
  1277. return ctx.NewCallable(pos, "AsTagged", {
  1278. ValueToExprLiteral(baseType, value, ctx, pos),
  1279. ctx.NewAtom(pos, taggedType->GetTag()),
  1280. });
  1281. }
  1282. case ETypeAnnotationKind::Pg: {
  1283. auto pgType = type->Cast<TPgExprType>();
  1284. if (!value) {
  1285. return ctx.NewCallable(pos, "Nothing", {
  1286. ctx.NewCallable(pos, "PgType", {
  1287. ctx.NewAtom(pos, pgType->GetName())
  1288. })
  1289. });
  1290. } else {
  1291. return ctx.NewCallable(pos, "PgConst", {
  1292. ctx.NewAtom(pos, PgValueToString(value, pgType->GetId())),
  1293. ctx.NewCallable(pos, "PgType", {
  1294. ctx.NewAtom(pos, pgType->GetName())
  1295. })
  1296. });
  1297. }
  1298. }
  1299. default:
  1300. break;
  1301. }
  1302. YQL_ENSURE(false, "Unsupported type: " << type->GetKind());
  1303. }
  1304. } // namespace NCommon
  1305. } // namespace NYql