yql_codec.cpp 112 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989
  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. #include <yt/yt/library/decimal/decimal.h>
  21. namespace NYql {
  22. namespace NCommon {
  23. using namespace NKikimr;
  24. using namespace NKikimr::NMiniKQL;
  25. using namespace NYson::NDetail;
  26. void WriteYsonValueImpl(NResult::TYsonResultWriter& writer, const NUdf::TUnboxedValuePod& value, TType* type,
  27. const TVector<ui32>* structPositions) {
  28. // Result format
  29. switch (type->GetKind()) {
  30. case TType::EKind::Void:
  31. writer.OnVoid();
  32. return;
  33. case TType::EKind::Null:
  34. writer.OnNull();
  35. return;
  36. case TType::EKind::EmptyList:
  37. writer.OnEmptyList();
  38. return;
  39. case TType::EKind::EmptyDict:
  40. writer.OnEmptyDict();
  41. return;
  42. case TType::EKind::Data:
  43. {
  44. auto dataType = AS_TYPE(TDataType, type);
  45. switch (*dataType->GetDataSlot()) {
  46. case NUdf::EDataSlot::Bool:
  47. writer.OnBooleanScalar(value.Get<bool>());
  48. return;
  49. case NUdf::EDataSlot::Int32:
  50. writer.OnInt64Scalar(value.Get<i32>());
  51. return;
  52. case NUdf::EDataSlot::Uint32:
  53. writer.OnUint64Scalar(value.Get<ui32>());
  54. return;
  55. case NUdf::EDataSlot::Int64:
  56. writer.OnInt64Scalar(value.Get<i64>());
  57. return;
  58. case NUdf::EDataSlot::Uint64:
  59. writer.OnUint64Scalar(value.Get<ui64>());
  60. return;
  61. case NUdf::EDataSlot::Uint8:
  62. writer.OnUint64Scalar(value.Get<ui8>());
  63. return;
  64. case NUdf::EDataSlot::Int8:
  65. writer.OnInt64Scalar(value.Get<i8>());
  66. return;
  67. case NUdf::EDataSlot::Uint16:
  68. writer.OnUint64Scalar(value.Get<ui16>());
  69. return;
  70. case NUdf::EDataSlot::Int16:
  71. writer.OnInt64Scalar(value.Get<i16>());
  72. return;
  73. case NUdf::EDataSlot::Float:
  74. writer.OnFloatScalar(value.Get<float>());
  75. return;
  76. case NUdf::EDataSlot::Double:
  77. writer.OnDoubleScalar(value.Get<double>());
  78. return;
  79. case NUdf::EDataSlot::Json:
  80. case NUdf::EDataSlot::Utf8:
  81. // assume underlying string is utf8
  82. writer.OnUtf8StringScalar(value.AsStringRef());
  83. return;
  84. case NUdf::EDataSlot::String:
  85. case NUdf::EDataSlot::Uuid:
  86. case NUdf::EDataSlot::DyNumber:
  87. writer.OnStringScalar(value.AsStringRef());
  88. return;
  89. case NUdf::EDataSlot::Decimal: {
  90. const auto params = static_cast<TDataDecimalType*>(type)->GetParams();
  91. const auto str = NDecimal::ToString(value.GetInt128(), params.first, params.second);
  92. const auto size = str ? std::strlen(str) : 0;
  93. writer.OnUtf8StringScalar(TStringBuf(str, size));
  94. return;
  95. }
  96. case NUdf::EDataSlot::Yson:
  97. NResult::EncodeRestrictedYson(writer, value.AsStringRef());
  98. return;
  99. case NUdf::EDataSlot::Date:
  100. writer.OnUint64Scalar(value.Get<ui16>());
  101. return;
  102. case NUdf::EDataSlot::Datetime:
  103. writer.OnUint64Scalar(value.Get<ui32>());
  104. return;
  105. case NUdf::EDataSlot::Timestamp:
  106. writer.OnUint64Scalar(value.Get<ui64>());
  107. return;
  108. case NUdf::EDataSlot::Interval:
  109. writer.OnInt64Scalar(value.Get<i64>());
  110. return;
  111. case NUdf::EDataSlot::TzDate:
  112. case NUdf::EDataSlot::TzDatetime:
  113. case NUdf::EDataSlot::TzTimestamp:
  114. case NUdf::EDataSlot::TzDate32:
  115. case NUdf::EDataSlot::TzDatetime64:
  116. case NUdf::EDataSlot::TzTimestamp64:
  117. case NUdf::EDataSlot::JsonDocument: {
  118. const NUdf::TUnboxedValue out(ValueToString(*dataType->GetDataSlot(), value));
  119. writer.OnUtf8StringScalar(out.AsStringRef());
  120. return;
  121. }
  122. case NUdf::EDataSlot::Date32:
  123. writer.OnInt64Scalar(value.Get<i32>());
  124. return;
  125. case NUdf::EDataSlot::Datetime64:
  126. writer.OnInt64Scalar(value.Get<i64>());
  127. return;
  128. case NUdf::EDataSlot::Timestamp64:
  129. writer.OnInt64Scalar(value.Get<i64>());
  130. return;
  131. case NUdf::EDataSlot::Interval64:
  132. writer.OnInt64Scalar(value.Get<i64>());
  133. return;
  134. }
  135. }
  136. break;
  137. case TType::EKind::Pg:
  138. {
  139. auto pgType = AS_TYPE(TPgType, type);
  140. WriteYsonValuePg(writer, value, pgType, structPositions);
  141. return;
  142. }
  143. case TType::EKind::Struct:
  144. {
  145. writer.OnBeginList();
  146. auto structType = AS_TYPE(TStructType, type);
  147. if (structPositions && structPositions->size() != structType->GetMembersCount()) {
  148. YQL_ENSURE(false, "Invalid struct positions");
  149. }
  150. for (ui32 i = 0, e = structType->GetMembersCount(); i < e; ++i) {
  151. const ui32 pos = structPositions ? (*structPositions)[i] : i;
  152. if (pos < e) {
  153. writer.OnListItem();
  154. WriteYsonValueImpl(writer, value.GetElement(pos), structType->GetMemberType(pos), nullptr);
  155. }
  156. }
  157. writer.OnEndList();
  158. return;
  159. }
  160. case TType::EKind::List:
  161. {
  162. writer.OnBeginList();
  163. auto listType = AS_TYPE(TListType, type);
  164. const auto it = value.GetListIterator();
  165. for (NUdf::TUnboxedValue item; it.Next(item);) {
  166. writer.OnListItem();
  167. WriteYsonValueImpl(writer, item, listType->GetItemType(), nullptr);
  168. }
  169. writer.OnEndList();
  170. return;
  171. }
  172. case TType::EKind::Optional:
  173. {
  174. if (!value) {
  175. writer.OnEntity();
  176. } else {
  177. writer.OnBeginList();
  178. auto optionalType = AS_TYPE(TOptionalType, type);
  179. writer.OnListItem();
  180. WriteYsonValueImpl(writer, value.GetOptionalValue(), optionalType->GetItemType(), nullptr);
  181. writer.OnEndList();
  182. }
  183. return;
  184. }
  185. case TType::EKind::Dict:
  186. {
  187. writer.OnBeginList();
  188. auto dictType = AS_TYPE(TDictType, type);
  189. const auto it = value.GetDictIterator();
  190. for (NUdf::TUnboxedValue key, payload; it.NextPair(key, payload);) {
  191. writer.OnListItem();
  192. writer.OnBeginList();
  193. {
  194. writer.OnListItem();
  195. WriteYsonValueImpl(writer, key, dictType->GetKeyType(), nullptr);
  196. writer.OnListItem();
  197. WriteYsonValueImpl(writer, payload, dictType->GetPayloadType(), nullptr);
  198. }
  199. writer.OnEndList();
  200. }
  201. writer.OnEndList();
  202. }
  203. return;
  204. case TType::EKind::Tuple:
  205. {
  206. writer.OnBeginList();
  207. auto tupleType = AS_TYPE(TTupleType, type);
  208. for (ui32 i = 0, e = tupleType->GetElementsCount(); i < e; ++i) {
  209. writer.OnListItem();
  210. WriteYsonValueImpl(writer, value.GetElement(i), tupleType->GetElementType(i), nullptr);
  211. }
  212. writer.OnEndList();
  213. return;
  214. }
  215. case TType::EKind::Variant:
  216. {
  217. writer.OnBeginList();
  218. auto underlyingType = AS_TYPE(TVariantType, type)->GetUnderlyingType();
  219. writer.OnListItem();
  220. auto index = value.GetVariantIndex();
  221. writer.OnUint64Scalar(index);
  222. writer.OnListItem();
  223. if (underlyingType->IsTuple()) {
  224. WriteYsonValueImpl(writer, value.GetVariantItem(), AS_TYPE(TTupleType, underlyingType)->GetElementType(index), nullptr);
  225. } else {
  226. WriteYsonValueImpl(writer, value.GetVariantItem(), AS_TYPE(TStructType, underlyingType)->GetMemberType(index), nullptr);
  227. }
  228. writer.OnEndList();
  229. return;
  230. }
  231. case TType::EKind::Tagged:
  232. {
  233. auto underlyingType = AS_TYPE(TTaggedType, type)->GetBaseType();
  234. WriteYsonValueImpl(writer, value, underlyingType, structPositions);
  235. return;
  236. }
  237. default:
  238. YQL_ENSURE(false, "unknown type " << type->GetKindAsStr());
  239. }
  240. }
  241. void WriteYsonValue(NYson::TYsonConsumerBase& writer, const NUdf::TUnboxedValuePod& value, TType* type,
  242. const TVector<ui32>* structPositions)
  243. {
  244. NResult::TYsonResultWriter resultWriter(writer);
  245. WriteYsonValueImpl(resultWriter, value, type, structPositions);
  246. }
  247. TString WriteYsonValue(const NUdf::TUnboxedValuePod& value, TType* type, const TVector<ui32>* structPositions,
  248. NYson::EYsonFormat format) {
  249. TStringStream str;
  250. NYson::TYsonWriter writer(&str, format);
  251. WriteYsonValue(writer, value, type, structPositions);
  252. return str.Str();
  253. }
  254. TCodecContext::TCodecContext(
  255. const TTypeEnvironment& env,
  256. const IFunctionRegistry& functionRegistry,
  257. const NKikimr::NMiniKQL::THolderFactory* holderFactory /* = nullptr */
  258. )
  259. : Env(env)
  260. , Builder(Env, functionRegistry)
  261. , HolderFactory(holderFactory)
  262. {
  263. }
  264. TMaybe<TVector<ui32>> CreateStructPositions(TType* inputType, const TVector<TString>* columns) {
  265. if (inputType->GetKind() != TType::EKind::Struct) {
  266. return Nothing();
  267. }
  268. auto inputStruct = AS_TYPE(TStructType, inputType);
  269. TMap<TStringBuf, ui32> members;
  270. TVector<ui32> structPositions(inputStruct->GetMembersCount(), Max<ui32>());
  271. for (ui32 i = 0; i < inputStruct->GetMembersCount(); ++i) {
  272. if (columns) {
  273. members.insert(std::make_pair(inputStruct->GetMemberName(i), i));
  274. } else {
  275. structPositions[i] = i;
  276. }
  277. }
  278. if (columns) {
  279. TColumnOrder order(*columns);
  280. ui32 pos = 0;
  281. for (auto& [column, gen_column]: order) {
  282. const ui32* idx = members.FindPtr(gen_column);
  283. YQL_ENSURE(idx, "Unknown member: " << gen_column);
  284. structPositions[pos] = *idx;
  285. ++pos;
  286. }
  287. }
  288. return structPositions;
  289. }
  290. namespace {
  291. NYT::TNode DataValueToNode(const NKikimr::NUdf::TUnboxedValuePod& value, NKikimr::NMiniKQL::TType* type) {
  292. YQL_ENSURE(type->GetKind() == TType::EKind::Data);
  293. auto dataType = AS_TYPE(TDataType, type);
  294. switch (dataType->GetSchemeType()) {
  295. case NUdf::TDataType<i32>::Id:
  296. return NYT::TNode(value.Get<i32>());
  297. case NUdf::TDataType<i64>::Id:
  298. return NYT::TNode(value.Get<i64>());
  299. case NUdf::TDataType<ui32>::Id:
  300. return NYT::TNode(value.Get<ui32>());
  301. case NUdf::TDataType<ui64>::Id:
  302. return NYT::TNode(value.Get<ui64>());
  303. case NUdf::TDataType<float>::Id:
  304. return NYT::TNode(value.Get<float>());
  305. case NUdf::TDataType<double>::Id:
  306. return NYT::TNode(value.Get<double>());
  307. case NUdf::TDataType<bool>::Id:
  308. return NYT::TNode(value.Get<bool>());
  309. case NUdf::TDataType<ui8>::Id:
  310. return NYT::TNode((ui64)value.Get<ui8>());
  311. case NUdf::TDataType<i8>::Id:
  312. return NYT::TNode((i64)value.Get<i8>());
  313. case NUdf::TDataType<ui16>::Id:
  314. return NYT::TNode((ui64)value.Get<ui16>());
  315. case NUdf::TDataType<i16>::Id:
  316. return NYT::TNode((i64)value.Get<i16>());
  317. case NUdf::TDataType<char*>::Id:
  318. case NUdf::TDataType<NUdf::TUtf8>::Id:
  319. case NUdf::TDataType<NUdf::TJson>::Id:
  320. case NUdf::TDataType<NUdf::TUuid>::Id:
  321. return NYT::TNode(TString(value.AsStringRef()));
  322. case NUdf::TDataType<NUdf::TYson>::Id:
  323. return NYT::NodeFromYsonString(TString(value.AsStringRef()));
  324. case NUdf::TDataType<NUdf::TDate>::Id:
  325. return NYT::TNode((ui64)value.Get<ui16>());
  326. case NUdf::TDataType<NUdf::TDatetime>::Id:
  327. return NYT::TNode((ui64)value.Get<ui32>());
  328. case NUdf::TDataType<NUdf::TTimestamp>::Id:
  329. return NYT::TNode(value.Get<ui64>());
  330. case NUdf::TDataType<NUdf::TInterval>::Id:
  331. return NYT::TNode(value.Get<i64>());
  332. case NUdf::TDataType<NUdf::TTzDate>::Id: {
  333. TStringStream out;
  334. out << value.Get<ui16>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  335. return NYT::TNode(out.Str());
  336. }
  337. case NUdf::TDataType<NUdf::TTzDatetime>::Id: {
  338. TStringStream out;
  339. out << value.Get<ui32>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  340. return NYT::TNode(out.Str());
  341. }
  342. case NUdf::TDataType<NUdf::TTzTimestamp>::Id: {
  343. TStringStream out;
  344. out << value.Get<ui64>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  345. return NYT::TNode(out.Str());
  346. }
  347. case NUdf::TDataType<NUdf::TDate32>::Id:
  348. return NYT::TNode((i64)value.Get<i32>());
  349. case NUdf::TDataType<NUdf::TDatetime64>::Id:
  350. return NYT::TNode(value.Get<i64>());
  351. case NUdf::TDataType<NUdf::TTimestamp64>::Id:
  352. return NYT::TNode(value.Get<i64>());
  353. case NUdf::TDataType<NUdf::TInterval64>::Id:
  354. return NYT::TNode(value.Get<i64>());
  355. case NUdf::TDataType<NUdf::TDecimal>::Id: {
  356. const auto params = static_cast<NKikimr::NMiniKQL::TDataDecimalType*>(type)->GetParams();
  357. return NYT::TNode(NDecimal::ToString(value.GetInt128(), params.first, params.second));
  358. }
  359. case NUdf::TDataType<NUdf::TJsonDocument>::Id: {
  360. NUdf::TUnboxedValue json = ValueToString(EDataSlot::JsonDocument, value);
  361. return NYT::TNode(ToString(TStringBuf(value.AsStringRef())));
  362. }
  363. case NUdf::TDataType<NUdf::TTzDate32>::Id: {
  364. TStringStream out;
  365. out << value.Get<i32>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  366. return NYT::TNode(out.Str());
  367. }
  368. case NUdf::TDataType<NUdf::TTzDatetime64>::Id: {
  369. TStringStream out;
  370. out << value.Get<i64>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  371. return NYT::TNode(out.Str());
  372. }
  373. case NUdf::TDataType<NUdf::TTzTimestamp64>::Id: {
  374. TStringStream out;
  375. out << value.Get<i64>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  376. return NYT::TNode(out.Str());
  377. }
  378. }
  379. YQL_ENSURE(false, "Unsupported type: " << static_cast<int>(dataType->GetSchemeType()));
  380. }
  381. TExprNode::TPtr DataNodeToExprLiteral(TPositionHandle pos, const TTypeAnnotationNode& type, const NYT::TNode& node, TExprContext& ctx) {
  382. YQL_ENSURE(type.GetKind() == ETypeAnnotationKind::Data, "Expecting data type, got: " << type);
  383. TString strData;
  384. if (type.Cast<TDataExprType>()->GetSlot() == EDataSlot::Yson) {
  385. strData = NYT::NodeToYsonString(node);
  386. } else {
  387. switch (node.GetType()) {
  388. case NYT::TNode::String:
  389. strData = node.AsString();
  390. break;
  391. case NYT::TNode::Int64:
  392. strData = ToString(node.AsInt64());
  393. break;
  394. case NYT::TNode::Uint64:
  395. strData = ToString(node.AsUint64());
  396. break;
  397. case NYT::TNode::Double:
  398. strData = FloatToString(node.AsDouble());
  399. break;
  400. case NYT::TNode::Bool:
  401. strData = ToString(node.AsBool());
  402. break;
  403. default:
  404. YQL_ENSURE(false, "Unexpected Yson type: " << node.GetType() << " while deserializing literal of type " << type);
  405. }
  406. }
  407. return ctx.Builder(pos)
  408. .Callable(type.Cast<TDataExprType>()->GetName())
  409. .Do([&](TExprNodeBuilder& parent) -> TExprNodeBuilder& {
  410. parent.Atom(0, strData);
  411. if (IsDataTypeDecimal(type.Cast<TDataExprType>()->GetSlot())) {
  412. auto decimalType = type.Cast<TDataExprParamsType>();
  413. parent.Atom(1, decimalType->GetParamOne());
  414. parent.Atom(2, decimalType->GetParamTwo());
  415. }
  416. return parent;
  417. })
  418. .Seal()
  419. .Build();
  420. }
  421. TString DataValueToString(const NKikimr::NUdf::TUnboxedValuePod& value, const TDataExprType* type) {
  422. switch (type->GetSlot()) {
  423. case NUdf::EDataSlot::Int32:
  424. case NUdf::EDataSlot::Date32:
  425. return ToString(value.Get<i32>());
  426. case NUdf::EDataSlot::Int64:
  427. case NUdf::EDataSlot::Interval:
  428. case NUdf::EDataSlot::Datetime64:
  429. case NUdf::EDataSlot::Timestamp64:
  430. case NUdf::EDataSlot::Interval64:
  431. return ToString(value.Get<i64>());
  432. case NUdf::EDataSlot::Uint32:
  433. case NUdf::EDataSlot::Datetime:
  434. return ToString(value.Get<ui32>());
  435. case NUdf::EDataSlot::Uint64:
  436. case NUdf::EDataSlot::Timestamp:
  437. return ToString(value.Get<ui64>());
  438. case NUdf::EDataSlot::Float:
  439. return ::FloatToString(value.Get<float>());
  440. case NUdf::EDataSlot::Double:
  441. return ::FloatToString(value.Get<double>());
  442. case NUdf::EDataSlot::Bool:
  443. return ToString(value.Get<bool>());
  444. case NUdf::EDataSlot::Uint8:
  445. return ToString(static_cast<unsigned int>(value.Get<ui8>()));
  446. case NUdf::EDataSlot::Int8:
  447. return ToString(static_cast<int>(value.Get<i8>()));
  448. case NUdf::EDataSlot::Uint16:
  449. case NUdf::EDataSlot::Date:
  450. return ToString(static_cast<unsigned int>(value.Get<ui16>()));
  451. case NUdf::EDataSlot::Int16:
  452. return ToString(static_cast<int>(value.Get<i16>()));
  453. case NUdf::EDataSlot::String:
  454. case NUdf::EDataSlot::Utf8:
  455. case NUdf::EDataSlot::Json:
  456. case NUdf::EDataSlot::Uuid:
  457. case NUdf::EDataSlot::Yson:
  458. case NUdf::EDataSlot::DyNumber:
  459. return ToString((TStringBuf)value.AsStringRef());
  460. case NUdf::EDataSlot::Decimal:
  461. {
  462. const auto params = dynamic_cast<const TDataExprParamsType*>(type);
  463. YQL_ENSURE(params, "Unable to cast decimal params");
  464. return NDecimal::ToString(value.GetInt128(), FromString<ui8>(params->GetParamOne()), FromString<ui8>(params->GetParamTwo()));
  465. }
  466. case NUdf::EDataSlot::TzDate: {
  467. TStringStream out;
  468. out << value.Get<ui16>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  469. return out.Str();
  470. }
  471. case NUdf::EDataSlot::TzDatetime: {
  472. TStringStream out;
  473. out << value.Get<ui32>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  474. return out.Str();
  475. }
  476. case NUdf::EDataSlot::TzTimestamp: {
  477. TStringStream out;
  478. out << value.Get<ui64>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  479. return out.Str();
  480. }
  481. case NUdf::EDataSlot::TzDate32: {
  482. TStringStream out;
  483. out << value.Get<i32>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  484. return out.Str();
  485. }
  486. case NUdf::EDataSlot::TzDatetime64: {
  487. TStringStream out;
  488. out << value.Get<i64>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  489. return out.Str();
  490. }
  491. case NUdf::EDataSlot::TzTimestamp64: {
  492. TStringStream out;
  493. out << value.Get<i64>() << "," << NKikimr::NMiniKQL::GetTimezoneIANAName(value.GetTimezoneId());
  494. return out.Str();
  495. }
  496. case NUdf::EDataSlot::JsonDocument: {
  497. NUdf::TUnboxedValue json = ValueToString(EDataSlot::JsonDocument, value);
  498. return ToString(TStringBuf(value.AsStringRef()));
  499. }
  500. }
  501. Y_ABORT("Unexpected");
  502. }
  503. } //namespace
  504. NYT::TNode ValueToNode(const NKikimr::NUdf::TUnboxedValuePod& value, NKikimr::NMiniKQL::TType* type) {
  505. NYT::TNode result;
  506. switch (type->GetKind()) {
  507. case TType::EKind::Optional: {
  508. result = NYT::TNode::CreateList();
  509. if (value) {
  510. result.Add(ValueToNode(value.GetOptionalValue(), AS_TYPE(TOptionalType, type)->GetItemType()));
  511. }
  512. break;
  513. }
  514. case TType::EKind::Tuple: {
  515. auto tupleType = AS_TYPE(TTupleType, type);
  516. result = NYT::TNode::CreateList();
  517. for (ui32 i = 0; i < tupleType->GetElementsCount(); ++i) {
  518. result.Add(ValueToNode(value.GetElement(i), tupleType->GetElementType(i)));
  519. }
  520. break;
  521. }
  522. case TType::EKind::List: {
  523. auto listType = AS_TYPE(TListType, type);
  524. result = NYT::TNode::CreateList();
  525. const auto iter = value.GetListIterator();
  526. for (NUdf::TUnboxedValue item; iter.Next(item); ) {
  527. result.Add(ValueToNode(item, listType->GetItemType()));
  528. }
  529. break;
  530. }
  531. default: {
  532. result = DataValueToNode(value, type);
  533. }
  534. }
  535. return result;
  536. }
  537. TExprNode::TPtr NodeToExprLiteral(TPositionHandle pos, const TTypeAnnotationNode& type, const NYT::TNode& node, TExprContext& ctx) {
  538. TExprNode::TPtr result;
  539. switch(type.GetKind()) {
  540. case ETypeAnnotationKind::Optional: {
  541. YQL_ENSURE(node.IsList() || node.IsNull());
  542. if (node.IsNull() || node.AsList().empty()) {
  543. return ctx.NewCallable(pos, "Nothing", { ExpandType(pos, type, ctx) });
  544. }
  545. YQL_ENSURE(node.AsList().size() == 1);
  546. result = ctx.NewCallable(pos, "Just", {
  547. NodeToExprLiteral(pos, *type.Cast<TOptionalExprType>()->GetItemType(), node.AsList().front(), ctx)
  548. });
  549. break;
  550. }
  551. case ETypeAnnotationKind::Tuple: {
  552. YQL_ENSURE(node.IsList());
  553. const TTypeAnnotationNode::TListType& itemTypes = type.Cast<TTupleExprType>()->GetItems();
  554. const auto& items = node.AsList();
  555. YQL_ENSURE(itemTypes.size() == items.size());
  556. TExprNodeList resultNodes;
  557. for (size_t i = 0; i < items.size(); ++i) {
  558. resultNodes.push_back(NodeToExprLiteral(pos, *itemTypes[i], items[i], ctx));
  559. }
  560. result = ctx.NewList(pos, std::move(resultNodes));
  561. break;
  562. }
  563. case ETypeAnnotationKind::List: {
  564. YQL_ENSURE(node.IsList());
  565. const TTypeAnnotationNode& itemType = *type.Cast<TListExprType>()->GetItemType();
  566. if (node.AsList().empty()) {
  567. return ctx.NewCallable(pos, "List", { ExpandType(pos, *ctx.MakeType<TListExprType>(&itemType), ctx) });
  568. }
  569. TExprNodeList children;
  570. for (auto& child : node.AsList()) {
  571. children.push_back(NodeToExprLiteral(pos, itemType, child, ctx));
  572. }
  573. result = ctx.NewCallable(pos, "AsList", std::move(children));
  574. break;
  575. }
  576. default: {
  577. result = DataNodeToExprLiteral(pos, type, node, ctx);
  578. }
  579. }
  580. return result;
  581. }
  582. void CopyYsonWithAttrs(char cmd, TInputBuf& buf, TVector<char>& yson) {
  583. if (cmd == BeginAttributesSymbol) {
  584. yson.push_back(cmd);
  585. cmd = buf.Read();
  586. for (;;) {
  587. if (cmd == EndAttributesSymbol) {
  588. yson.push_back(cmd);
  589. cmd = buf.Read();
  590. break;
  591. }
  592. CHECK_EXPECTED(cmd, StringMarker);
  593. yson.push_back(cmd);
  594. i32 length = buf.CopyVarI32(yson);
  595. CHECK_STRING_LENGTH(length);
  596. buf.CopyMany(length, yson);
  597. EXPECTED_COPY(buf, KeyValueSeparatorSymbol, yson);
  598. cmd = buf.Read();
  599. CopyYsonWithAttrs(cmd, buf, yson);
  600. cmd = buf.Read();
  601. if (cmd == KeyedItemSeparatorSymbol) {
  602. yson.push_back(cmd);
  603. cmd = buf.Read();
  604. }
  605. }
  606. }
  607. CopyYson(cmd, buf, yson);
  608. }
  609. void CopyYson(char cmd, TInputBuf& buf, TVector<char>& yson) {
  610. switch (cmd) {
  611. case EntitySymbol:
  612. case TrueMarker:
  613. case FalseMarker:
  614. yson.push_back(cmd);
  615. break;
  616. case Int64Marker:
  617. yson.push_back(cmd);
  618. buf.CopyVarI64(yson);
  619. break;
  620. case Uint64Marker:
  621. yson.push_back(cmd);
  622. buf.CopyVarUI64(yson);
  623. break;
  624. case DoubleMarker:
  625. yson.push_back(cmd);
  626. buf.CopyMany(8, yson);
  627. break;
  628. case StringMarker: {
  629. yson.push_back(cmd);
  630. i32 length = buf.CopyVarI32(yson);
  631. CHECK_STRING_LENGTH(length);
  632. buf.CopyMany(length, yson);
  633. break;
  634. }
  635. case BeginListSymbol: {
  636. yson.push_back(cmd);
  637. cmd = buf.Read();
  638. for (;;) {
  639. if (cmd == EndListSymbol) {
  640. yson.push_back(cmd);
  641. break;
  642. }
  643. CopyYsonWithAttrs(cmd, buf, yson);
  644. cmd = buf.Read();
  645. if (cmd == ListItemSeparatorSymbol) {
  646. yson.push_back(cmd);
  647. cmd = buf.Read();
  648. }
  649. }
  650. break;
  651. }
  652. case BeginMapSymbol: {
  653. yson.push_back(cmd);
  654. cmd = buf.Read();
  655. for (;;) {
  656. if (cmd == EndMapSymbol) {
  657. yson.push_back(cmd);
  658. break;
  659. }
  660. CHECK_EXPECTED(cmd, StringMarker);
  661. yson.push_back(cmd);
  662. i32 length = buf.CopyVarI32(yson);
  663. CHECK_STRING_LENGTH(length);
  664. buf.CopyMany(length, yson);
  665. EXPECTED_COPY(buf, KeyValueSeparatorSymbol, yson);
  666. cmd = buf.Read();
  667. CopyYsonWithAttrs(cmd, buf, yson);
  668. cmd = buf.Read();
  669. if (cmd == KeyedItemSeparatorSymbol) {
  670. yson.push_back(cmd);
  671. cmd = buf.Read();
  672. }
  673. }
  674. break;
  675. }
  676. default:
  677. YQL_ENSURE(false, "Unexpected yson character: " << cmd);
  678. }
  679. }
  680. void SkipYson(char cmd, TInputBuf& buf) {
  681. auto& yson = buf.YsonBuffer();
  682. yson.clear();
  683. CopyYsonWithAttrs(cmd, buf, yson);
  684. }
  685. NUdf::TUnboxedValue ReadYsonStringInResultFormat(char cmd, TInputBuf& buf) {
  686. NUdf::TUnboxedValue result;
  687. const bool needDecode = (cmd == BeginListSymbol);
  688. if (needDecode) {
  689. cmd = buf.Read();
  690. }
  691. CHECK_EXPECTED(cmd, StringMarker);
  692. const i32 length = buf.ReadVarI32();
  693. CHECK_STRING_LENGTH(length);
  694. TTempBuf tmpBuf(length);
  695. buf.ReadMany(tmpBuf.Data(), length);
  696. if (needDecode) {
  697. TString decoded = Base64Decode(TStringBuf(tmpBuf.Data(), length));
  698. result = NUdf::TUnboxedValue(MakeString(NUdf::TStringRef(decoded)));
  699. } else {
  700. result = NUdf::TUnboxedValue(MakeString(NUdf::TStringRef(tmpBuf.Data(), length)));
  701. }
  702. if (needDecode) {
  703. cmd = buf.Read();
  704. if (cmd == ListItemSeparatorSymbol) {
  705. cmd = buf.Read();
  706. }
  707. CHECK_EXPECTED(cmd, EndListSymbol);
  708. }
  709. return result;
  710. }
  711. TStringBuf ReadNextString(char cmd, TInputBuf& buf) {
  712. CHECK_EXPECTED(cmd, StringMarker);
  713. return buf.ReadYtString();
  714. }
  715. template <typename T>
  716. T ReadNextSerializedNumber(char cmd, TInputBuf& buf) {
  717. auto nextString = ReadNextString(cmd, buf);
  718. if constexpr (!std::numeric_limits<T>::is_integer) {
  719. if (nextString == "inf" || nextString == "+inf") {
  720. return std::numeric_limits<T>::infinity();
  721. } else if (nextString == "-inf") {
  722. return -std::numeric_limits<T>::infinity();
  723. } else if (nextString == "nan") {
  724. return std::numeric_limits<T>::quiet_NaN();
  725. }
  726. }
  727. return FromString<T>(nextString);
  728. }
  729. template <typename T>
  730. T ReadYsonFloatNumber(char cmd, TInputBuf& buf, bool isTableFormat) {
  731. if (isTableFormat) {
  732. CHECK_EXPECTED(cmd, DoubleMarker);
  733. double dbl;
  734. buf.ReadMany((char*)&dbl, sizeof(dbl));
  735. return dbl;
  736. }
  737. return ReadNextSerializedNumber<T>(cmd, buf);
  738. }
  739. NUdf::TUnboxedValue ReadYsonValue(TType* type, ui64 nativeYtTypeFlags,
  740. const NKikimr::NMiniKQL::THolderFactory& holderFactory, char cmd, TInputBuf& buf, bool isTableFormat) {
  741. switch (type->GetKind()) {
  742. case TType::EKind::Variant: {
  743. auto varType = static_cast<TVariantType*>(type);
  744. auto underlyingType = varType->GetUnderlyingType();
  745. if (isTableFormat && (nativeYtTypeFlags & NTCF_COMPLEX)) {
  746. CHECK_EXPECTED(cmd, BeginListSymbol);
  747. cmd = buf.Read();
  748. TType* type = nullptr;
  749. i64 index = 0;
  750. if (cmd == StringMarker) {
  751. YQL_ENSURE(underlyingType->IsStruct(), "Expected struct as underlying type");
  752. auto structType = static_cast<TStructType*>(underlyingType);
  753. auto nameBuffer = ReadNextString(cmd, buf);
  754. auto foundIndex = structType->FindMemberIndex(nameBuffer);
  755. YQL_ENSURE(foundIndex.Defined(), "Unexpected member: " << nameBuffer);
  756. index = *foundIndex;
  757. type = varType->GetAlternativeType(index);
  758. } else {
  759. YQL_ENSURE(cmd == Int64Marker || cmd == Uint64Marker);
  760. YQL_ENSURE(underlyingType->IsTuple(), "Expected tuple as underlying type");
  761. if (cmd == Uint64Marker) {
  762. index = buf.ReadVarUI64();
  763. } else {
  764. index = buf.ReadVarI64();
  765. }
  766. YQL_ENSURE(0 <= index && index < varType->GetAlternativesCount(), "Unexpected member index: " << index);
  767. type = varType->GetAlternativeType(index);
  768. }
  769. cmd = buf.Read();
  770. CHECK_EXPECTED(cmd, ListItemSeparatorSymbol);
  771. cmd = buf.Read();
  772. auto value = ReadYsonValue(type, nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat);
  773. cmd = buf.Read();
  774. if (cmd != EndListSymbol) {
  775. CHECK_EXPECTED(cmd, ListItemSeparatorSymbol);
  776. cmd = buf.Read();
  777. CHECK_EXPECTED(cmd, EndListSymbol);
  778. }
  779. return holderFactory.CreateVariantHolder(value.Release(), index);
  780. } else {
  781. if (cmd == StringMarker) {
  782. YQL_ENSURE(underlyingType->IsStruct(), "Expected struct as underlying type");
  783. auto name = ReadNextString(cmd, buf);
  784. auto index = static_cast<TStructType*>(underlyingType)->FindMemberIndex(name);
  785. YQL_ENSURE(index, "Unexpected member: " << name);
  786. YQL_ENSURE(static_cast<TStructType*>(underlyingType)->GetMemberType(*index)->IsVoid(), "Expected Void as underlying type");
  787. return holderFactory.CreateVariantHolder(NUdf::TUnboxedValuePod::Zero(), *index);
  788. }
  789. CHECK_EXPECTED(cmd, BeginListSymbol);
  790. cmd = buf.Read();
  791. i64 index = 0;
  792. if (isTableFormat) {
  793. YQL_ENSURE(cmd == Int64Marker || cmd == Uint64Marker);
  794. if (cmd == Uint64Marker) {
  795. index = buf.ReadVarUI64();
  796. } else {
  797. index = buf.ReadVarI64();
  798. }
  799. } else {
  800. if (cmd == BeginListSymbol) {
  801. cmd = buf.Read();
  802. YQL_ENSURE(underlyingType->IsStruct(), "Expected struct as underlying type");
  803. auto name = ReadNextString(cmd, buf);
  804. auto foundIndex = static_cast<TStructType*>(underlyingType)->FindMemberIndex(name);
  805. YQL_ENSURE(foundIndex, "Unexpected member: " << name);
  806. index = *foundIndex;
  807. cmd = buf.Read();
  808. if (cmd == ListItemSeparatorSymbol) {
  809. cmd = buf.Read();
  810. }
  811. CHECK_EXPECTED(cmd, EndListSymbol);
  812. } else {
  813. index = ReadNextSerializedNumber<ui64>(cmd, buf);
  814. }
  815. }
  816. YQL_ENSURE(index < varType->GetAlternativesCount(), "Bad variant alternative: " << index << ", only " <<
  817. varType->GetAlternativesCount() << " are available");
  818. YQL_ENSURE(underlyingType->IsTuple() || underlyingType->IsStruct(), "Wrong underlying type");
  819. TType* itemType;
  820. if (underlyingType->IsTuple()) {
  821. itemType = static_cast<TTupleType*>(underlyingType)->GetElementType(index);
  822. }
  823. else {
  824. itemType = static_cast<TStructType*>(underlyingType)->GetMemberType(index);
  825. }
  826. EXPECTED(buf, ListItemSeparatorSymbol);
  827. cmd = buf.Read();
  828. auto value = ReadYsonValue(itemType, nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat);
  829. cmd = buf.Read();
  830. if (cmd == ListItemSeparatorSymbol) {
  831. cmd = buf.Read();
  832. }
  833. CHECK_EXPECTED(cmd, EndListSymbol);
  834. return holderFactory.CreateVariantHolder(value.Release(), index);
  835. }
  836. }
  837. case TType::EKind::Data: {
  838. auto schemeType = static_cast<TDataType*>(type)->GetSchemeType();
  839. switch (schemeType) {
  840. case NUdf::TDataType<bool>::Id:
  841. YQL_ENSURE(cmd == FalseMarker || cmd == TrueMarker, "Expected either true or false, but got: " << TString(cmd).Quote());
  842. return NUdf::TUnboxedValuePod(cmd == TrueMarker);
  843. case NUdf::TDataType<ui8>::Id:
  844. if (isTableFormat) {
  845. CHECK_EXPECTED(cmd, Uint64Marker);
  846. return NUdf::TUnboxedValuePod(ui8(buf.ReadVarUI64()));
  847. }
  848. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<ui8>(cmd, buf));
  849. case NUdf::TDataType<i8>::Id:
  850. if (isTableFormat) {
  851. CHECK_EXPECTED(cmd, Int64Marker);
  852. return NUdf::TUnboxedValuePod(i8(buf.ReadVarI64()));
  853. }
  854. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<i8>(cmd, buf));
  855. case NUdf::TDataType<ui16>::Id:
  856. if (isTableFormat) {
  857. CHECK_EXPECTED(cmd, Uint64Marker);
  858. return NUdf::TUnboxedValuePod(ui16(buf.ReadVarUI64()));
  859. }
  860. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<ui16>(cmd, buf));
  861. case NUdf::TDataType<i16>::Id:
  862. if (isTableFormat) {
  863. CHECK_EXPECTED(cmd, Int64Marker);
  864. return NUdf::TUnboxedValuePod(i16(buf.ReadVarI64()));
  865. }
  866. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<i16>(cmd, buf));
  867. case NUdf::TDataType<i32>::Id:
  868. if (isTableFormat) {
  869. CHECK_EXPECTED(cmd, Int64Marker);
  870. return NUdf::TUnboxedValuePod(i32(buf.ReadVarI64()));
  871. }
  872. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<i32>(cmd, buf));
  873. case NUdf::TDataType<ui32>::Id:
  874. if (isTableFormat) {
  875. CHECK_EXPECTED(cmd, Uint64Marker);
  876. return NUdf::TUnboxedValuePod(ui32(buf.ReadVarUI64()));
  877. }
  878. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<ui32>(cmd, buf));
  879. case NUdf::TDataType<i64>::Id:
  880. if (isTableFormat) {
  881. CHECK_EXPECTED(cmd, Int64Marker);
  882. return NUdf::TUnboxedValuePod(buf.ReadVarI64());
  883. }
  884. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<i64>(cmd, buf));
  885. case NUdf::TDataType<ui64>::Id:
  886. if (isTableFormat) {
  887. CHECK_EXPECTED(cmd, Uint64Marker);
  888. return NUdf::TUnboxedValuePod(buf.ReadVarUI64());
  889. }
  890. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<ui64>(cmd, buf));
  891. case NUdf::TDataType<float>::Id:
  892. return NUdf::TUnboxedValuePod(ReadYsonFloatNumber<float>(cmd, buf, isTableFormat));
  893. case NUdf::TDataType<double>::Id:
  894. return NUdf::TUnboxedValuePod(ReadYsonFloatNumber<double>(cmd, buf, isTableFormat));
  895. case NUdf::TDataType<NUdf::TUtf8>::Id:
  896. case NUdf::TDataType<char*>::Id:
  897. case NUdf::TDataType<NUdf::TJson>::Id:
  898. case NUdf::TDataType<NUdf::TDyNumber>::Id:
  899. case NUdf::TDataType<NUdf::TUuid>::Id: {
  900. if (isTableFormat) {
  901. auto nextString = ReadNextString(cmd, buf);
  902. return NUdf::TUnboxedValue(MakeString(NUdf::TStringRef(nextString)));
  903. }
  904. return ReadYsonStringInResultFormat(cmd, buf);
  905. }
  906. case NUdf::TDataType<NUdf::TDecimal>::Id: {
  907. auto nextString = ReadNextString(cmd, buf);
  908. if (isTableFormat) {
  909. if (nativeYtTypeFlags & NTCF_DECIMAL) {
  910. auto const params = static_cast<TDataDecimalType*>(type)->GetParams();
  911. if (params.first < 10) {
  912. // The YQL format differs from the YT format in the inf/nan values. NDecimal::FromYtDecimal converts nan/inf
  913. NDecimal::TInt128 res = NDecimal::FromYtDecimal(NYT::NDecimal::TDecimal::ParseBinary32(params.first, nextString));
  914. YQL_ENSURE(!NDecimal::IsError(res));
  915. return NUdf::TUnboxedValuePod(res);
  916. } else if (params.first < 19) {
  917. NDecimal::TInt128 res = NDecimal::FromYtDecimal(NYT::NDecimal::TDecimal::ParseBinary64(params.first, nextString));
  918. YQL_ENSURE(!NDecimal::IsError(res));
  919. return NUdf::TUnboxedValuePod(res);
  920. } else {
  921. YQL_ENSURE(params.first < 36);
  922. NYT::NDecimal::TDecimal::TValue128 tmpRes = NYT::NDecimal::TDecimal::ParseBinary128(params.first, nextString);
  923. NDecimal::TInt128 res;
  924. static_assert(sizeof(NDecimal::TInt128) == sizeof(NYT::NDecimal::TDecimal::TValue128));
  925. memcpy(&res, &tmpRes, sizeof(NDecimal::TInt128));
  926. res = NDecimal::FromYtDecimal(res);
  927. YQL_ENSURE(!NDecimal::IsError(res));
  928. return NUdf::TUnboxedValuePod(res);
  929. }
  930. }
  931. else {
  932. const auto& des = NDecimal::Deserialize(nextString.data(), nextString.size());
  933. YQL_ENSURE(!NDecimal::IsError(des.first));
  934. YQL_ENSURE(nextString.size() == des.second);
  935. return NUdf::TUnboxedValuePod(des.first);
  936. }
  937. } else {
  938. const auto params = static_cast<TDataDecimalType*>(type)->GetParams();
  939. const auto val = NDecimal::FromString(nextString, params.first, params.second);
  940. YQL_ENSURE(!NDecimal::IsError(val));
  941. return NUdf::TUnboxedValuePod(val);
  942. }
  943. }
  944. case NUdf::TDataType<NUdf::TYson>::Id: {
  945. auto& yson = buf.YsonBuffer();
  946. yson.clear();
  947. CopyYsonWithAttrs(cmd, buf, yson);
  948. if (isTableFormat) {
  949. return NUdf::TUnboxedValue(MakeString(NUdf::TStringRef(yson)));
  950. }
  951. TString decodedYson = NResult::DecodeRestrictedYson(TStringBuf(yson.data(), yson.size()), NYson::EYsonFormat::Text);
  952. return NUdf::TUnboxedValue(MakeString(NUdf::TStringRef(decodedYson)));
  953. }
  954. case NUdf::TDataType<NUdf::TDate>::Id:
  955. if (isTableFormat) {
  956. CHECK_EXPECTED(cmd, Uint64Marker);
  957. return NUdf::TUnboxedValuePod((ui16)buf.ReadVarUI64());
  958. }
  959. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<ui16>(cmd, buf));
  960. case NUdf::TDataType<NUdf::TDatetime>::Id:
  961. if (isTableFormat) {
  962. CHECK_EXPECTED(cmd, Uint64Marker);
  963. return NUdf::TUnboxedValuePod((ui32)buf.ReadVarUI64());
  964. }
  965. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<ui32>(cmd, buf));
  966. case NUdf::TDataType<NUdf::TTimestamp>::Id:
  967. if (isTableFormat) {
  968. CHECK_EXPECTED(cmd, Uint64Marker);
  969. return NUdf::TUnboxedValuePod(buf.ReadVarUI64());
  970. }
  971. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<ui64>(cmd, buf));
  972. case NUdf::TDataType<NUdf::TInterval>::Id:
  973. if (isTableFormat) {
  974. CHECK_EXPECTED(cmd, Int64Marker);
  975. return NUdf::TUnboxedValuePod(buf.ReadVarI64());
  976. }
  977. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<i64>(cmd, buf));
  978. case NUdf::TDataType<NUdf::TTzDate>::Id: {
  979. auto nextString = ReadNextString(cmd, buf);
  980. NUdf::TUnboxedValuePod data;
  981. if (isTableFormat) {
  982. ui16 value;
  983. ui16 tzId = 0;
  984. YQL_ENSURE(DeserializeTzDate(nextString, value, tzId));
  985. data = NUdf::TUnboxedValuePod(value);
  986. data.SetTimezoneId(tzId);
  987. } else {
  988. data = ValueFromString(NUdf::EDataSlot::TzDate, nextString);
  989. YQL_ENSURE(data, "incorrect tz date format for value " << nextString);
  990. }
  991. return data;
  992. }
  993. case NUdf::TDataType<NUdf::TTzDatetime>::Id: {
  994. auto nextString = ReadNextString(cmd, buf);
  995. NUdf::TUnboxedValuePod data;
  996. if (isTableFormat) {
  997. ui32 value;
  998. ui16 tzId = 0;
  999. YQL_ENSURE(DeserializeTzDatetime(nextString, value, tzId));
  1000. data = NUdf::TUnboxedValuePod(value);
  1001. data.SetTimezoneId(tzId);
  1002. } else {
  1003. data = ValueFromString(NUdf::EDataSlot::TzDatetime, nextString);
  1004. YQL_ENSURE(data, "incorrect tz datetime format for value " << nextString);
  1005. }
  1006. return data;
  1007. }
  1008. case NUdf::TDataType<NUdf::TTzTimestamp>::Id: {
  1009. auto nextString = ReadNextString(cmd, buf);
  1010. NUdf::TUnboxedValuePod data;
  1011. if (isTableFormat) {
  1012. ui64 value;
  1013. ui16 tzId = 0;
  1014. YQL_ENSURE(DeserializeTzTimestamp(nextString, value, tzId));
  1015. data = NUdf::TUnboxedValuePod(value);
  1016. data.SetTimezoneId(tzId);
  1017. } else {
  1018. data = ValueFromString(NUdf::EDataSlot::TzTimestamp, nextString);
  1019. YQL_ENSURE(data, "incorrect tz timestamp format for value " << nextString);
  1020. }
  1021. return data;
  1022. }
  1023. case NUdf::TDataType<NUdf::TDate32>::Id:
  1024. if (isTableFormat) {
  1025. CHECK_EXPECTED(cmd, Int64Marker);
  1026. return NUdf::TUnboxedValuePod((i32)buf.ReadVarI64());
  1027. }
  1028. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<i32>(cmd, buf));
  1029. case NUdf::TDataType<NUdf::TDatetime64>::Id:
  1030. case NUdf::TDataType<NUdf::TTimestamp64>::Id:
  1031. case NUdf::TDataType<NUdf::TInterval64>::Id:
  1032. if (isTableFormat) {
  1033. CHECK_EXPECTED(cmd, Int64Marker);
  1034. return NUdf::TUnboxedValuePod(buf.ReadVarI64());
  1035. }
  1036. return NUdf::TUnboxedValuePod(ReadNextSerializedNumber<i64>(cmd, buf));
  1037. case NUdf::TDataType<NUdf::TJsonDocument>::Id: {
  1038. if (isTableFormat) {
  1039. return ValueFromString(EDataSlot::JsonDocument, ReadNextString(cmd, buf));
  1040. }
  1041. const auto json = ReadYsonStringInResultFormat(cmd, buf);
  1042. return ValueFromString(EDataSlot::JsonDocument, json.AsStringRef());
  1043. }
  1044. case NUdf::TDataType<NUdf::TTzDate32>::Id: {
  1045. auto nextString = ReadNextString(cmd, buf);
  1046. NUdf::TUnboxedValuePod data;
  1047. if (isTableFormat) {
  1048. i32 value;
  1049. ui16 tzId = 0;
  1050. YQL_ENSURE(DeserializeTzDate32(nextString, value, tzId));
  1051. data = NUdf::TUnboxedValuePod(value);
  1052. data.SetTimezoneId(tzId);
  1053. } else {
  1054. data = ValueFromString(NUdf::EDataSlot::TzDate32, nextString);
  1055. YQL_ENSURE(data, "incorrect tz date format for value " << nextString);
  1056. }
  1057. return data;
  1058. }
  1059. case NUdf::TDataType<NUdf::TTzDatetime64>::Id: {
  1060. auto nextString = ReadNextString(cmd, buf);
  1061. NUdf::TUnboxedValuePod data;
  1062. if (isTableFormat) {
  1063. i64 value;
  1064. ui16 tzId = 0;
  1065. YQL_ENSURE(DeserializeTzDatetime64(nextString, value, tzId));
  1066. data = NUdf::TUnboxedValuePod(value);
  1067. data.SetTimezoneId(tzId);
  1068. } else {
  1069. data = ValueFromString(NUdf::EDataSlot::TzDatetime64, nextString);
  1070. YQL_ENSURE(data, "incorrect tz datetime format for value " << nextString);
  1071. }
  1072. return data;
  1073. }
  1074. case NUdf::TDataType<NUdf::TTzTimestamp64>::Id: {
  1075. auto nextString = ReadNextString(cmd, buf);
  1076. NUdf::TUnboxedValuePod data;
  1077. if (isTableFormat) {
  1078. i64 value;
  1079. ui16 tzId = 0;
  1080. YQL_ENSURE(DeserializeTzTimestamp64(nextString, value, tzId));
  1081. data = NUdf::TUnboxedValuePod(value);
  1082. data.SetTimezoneId(tzId);
  1083. } else {
  1084. data = ValueFromString(NUdf::EDataSlot::TzTimestamp64, nextString);
  1085. YQL_ENSURE(data, "incorrect tz timestamp format for value " << nextString);
  1086. }
  1087. return data;
  1088. }
  1089. default:
  1090. YQL_ENSURE(false, "Unsupported data type: " << schemeType);
  1091. }
  1092. }
  1093. case TType::EKind::Struct: {
  1094. YQL_ENSURE(cmd == BeginListSymbol || cmd == BeginMapSymbol);
  1095. auto structType = static_cast<TStructType*>(type);
  1096. NUdf::TUnboxedValue* items;
  1097. NUdf::TUnboxedValue ret = holderFactory.CreateDirectArrayHolder(structType->GetMembersCount(), items);
  1098. if (cmd == BeginListSymbol) {
  1099. cmd = buf.Read();
  1100. for (ui32 i = 0; i < structType->GetMembersCount(); ++i) {
  1101. items[i] = ReadYsonValue(structType->GetMemberType(i), nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat);
  1102. cmd = buf.Read();
  1103. if (cmd == ListItemSeparatorSymbol) {
  1104. cmd = buf.Read();
  1105. }
  1106. }
  1107. CHECK_EXPECTED(cmd, EndListSymbol);
  1108. return ret;
  1109. } else {
  1110. cmd = buf.Read();
  1111. for (;;) {
  1112. if (cmd == EndMapSymbol) {
  1113. break;
  1114. }
  1115. auto keyBuffer = ReadNextString(cmd, buf);
  1116. auto pos = structType->FindMemberIndex(keyBuffer);
  1117. EXPECTED(buf, KeyValueSeparatorSymbol);
  1118. cmd = buf.Read();
  1119. if (pos && cmd != '#') {
  1120. auto memberType = structType->GetMemberType(*pos);
  1121. auto unwrappedType = memberType;
  1122. if (!(nativeYtTypeFlags & ENativeTypeCompatFlags::NTCF_COMPLEX) && isTableFormat && unwrappedType->IsOptional()) {
  1123. unwrappedType = static_cast<TOptionalType*>(unwrappedType)->GetItemType();
  1124. }
  1125. items[*pos] = ReadYsonValue(unwrappedType, nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat);
  1126. } else {
  1127. SkipYson(cmd, buf);
  1128. }
  1129. cmd = buf.Read();
  1130. if (cmd == KeyedItemSeparatorSymbol) {
  1131. cmd = buf.Read();
  1132. }
  1133. }
  1134. for (ui32 i = 0; i < structType->GetMembersCount(); ++i) {
  1135. if (items[i]) {
  1136. continue;
  1137. }
  1138. YQL_ENSURE(structType->GetMemberType(i)->IsOptional(), "Missing required field: " << structType->GetMemberName(i));
  1139. }
  1140. return ret;
  1141. }
  1142. }
  1143. case TType::EKind::List: {
  1144. auto itemType = static_cast<TListType*>(type)->GetItemType();
  1145. TDefaultListRepresentation items;
  1146. CHECK_EXPECTED(cmd, BeginListSymbol);
  1147. cmd = buf.Read();
  1148. for (;;) {
  1149. if (cmd == EndListSymbol) {
  1150. break;
  1151. }
  1152. items = items.Append(ReadYsonValue(itemType, nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat));
  1153. cmd = buf.Read();
  1154. if (cmd == ListItemSeparatorSymbol) {
  1155. cmd = buf.Read();
  1156. }
  1157. }
  1158. return holderFactory.CreateDirectListHolder(std::move(items));
  1159. }
  1160. case TType::EKind::Optional: {
  1161. if (cmd == EntitySymbol) {
  1162. return NUdf::TUnboxedValuePod();
  1163. }
  1164. auto itemType = static_cast<TOptionalType*>(type)->GetItemType();
  1165. if (isTableFormat && (nativeYtTypeFlags & ENativeTypeCompatFlags::NTCF_COMPLEX)) {
  1166. if (itemType->GetKind() == TType::EKind::Optional || itemType->GetKind() == TType::EKind::Pg) {
  1167. CHECK_EXPECTED(cmd, BeginListSymbol);
  1168. cmd = buf.Read();
  1169. auto value = ReadYsonValue(itemType, nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat);
  1170. cmd = buf.Read();
  1171. if (cmd == ListItemSeparatorSymbol) {
  1172. cmd = buf.Read();
  1173. }
  1174. CHECK_EXPECTED(cmd, EndListSymbol);
  1175. return value.Release().MakeOptional();
  1176. } else {
  1177. return ReadYsonValue(itemType, nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat).Release().MakeOptional();
  1178. }
  1179. } else {
  1180. if (cmd != BeginListSymbol) {
  1181. auto value = ReadYsonValue(itemType, nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat);
  1182. return value.Release().MakeOptional();
  1183. }
  1184. cmd = buf.Read();
  1185. if (cmd == EndListSymbol) {
  1186. return NUdf::TUnboxedValuePod();
  1187. }
  1188. auto value = ReadYsonValue(itemType, nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat);
  1189. cmd = buf.Read();
  1190. if (cmd == ListItemSeparatorSymbol) {
  1191. cmd = buf.Read();
  1192. }
  1193. CHECK_EXPECTED(cmd, EndListSymbol);
  1194. return value.Release().MakeOptional();
  1195. }
  1196. }
  1197. case TType::EKind::Dict: {
  1198. auto dictType = static_cast<TDictType*>(type);
  1199. auto keyType = dictType->GetKeyType();
  1200. auto payloadType = dictType->GetPayloadType();
  1201. TKeyTypes types;
  1202. bool isTuple;
  1203. bool encoded;
  1204. bool useIHash;
  1205. GetDictionaryKeyTypes(keyType, types, isTuple, encoded, useIHash);
  1206. TMaybe<TValuePacker> packer;
  1207. if (encoded) {
  1208. packer.ConstructInPlace(true, keyType);
  1209. }
  1210. YQL_ENSURE(cmd == BeginListSymbol || cmd == BeginMapSymbol, "Expected '{' or '[', but read: " << TString(cmd).Quote());
  1211. if (cmd == BeginMapSymbol) {
  1212. bool unusedIsOptional;
  1213. auto unpackedType = UnpackOptional(keyType, unusedIsOptional);
  1214. YQL_ENSURE(unpackedType->IsData() &&
  1215. (static_cast<TDataType*>(unpackedType)->GetSchemeType() == NUdf::TDataType<char*>::Id ||
  1216. static_cast<TDataType*>(unpackedType)->GetSchemeType() == NUdf::TDataType<NUdf::TUtf8>::Id),
  1217. "Expected String or Utf8 type as dictionary key type");
  1218. auto filler = [&](TValuesDictHashMap& map) {
  1219. cmd = buf.Read();
  1220. for (;;) {
  1221. if (cmd == EndMapSymbol) {
  1222. break;
  1223. }
  1224. auto keyBuffer = ReadNextString(cmd, buf);
  1225. auto keyStr = NUdf::TUnboxedValue(MakeString(keyBuffer));
  1226. EXPECTED(buf, KeyValueSeparatorSymbol);
  1227. cmd = buf.Read();
  1228. auto payload = ReadYsonValue(payloadType, nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat);
  1229. map.emplace(std::move(keyStr), std::move(payload));
  1230. cmd = buf.Read();
  1231. if (cmd == KeyedItemSeparatorSymbol) {
  1232. cmd = buf.Read();
  1233. }
  1234. }
  1235. };
  1236. const NUdf::IHash* hash = holderFactory.GetHash(*keyType, useIHash);
  1237. const NUdf::IEquate* equate = holderFactory.GetEquate(*keyType, useIHash);
  1238. return holderFactory.CreateDirectHashedDictHolder(filler, types, isTuple, true, nullptr, hash, equate);
  1239. }
  1240. else {
  1241. auto filler = [&](TValuesDictHashMap& map) {
  1242. cmd = buf.Read();
  1243. for (;;) {
  1244. if (cmd == EndListSymbol) {
  1245. break;
  1246. }
  1247. CHECK_EXPECTED(cmd, BeginListSymbol);
  1248. cmd = buf.Read();
  1249. auto key = ReadYsonValue(keyType, nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat);
  1250. EXPECTED(buf, ListItemSeparatorSymbol);
  1251. cmd = buf.Read();
  1252. auto payload = ReadYsonValue(payloadType, nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat);
  1253. cmd = buf.Read();
  1254. if (cmd == ListItemSeparatorSymbol) {
  1255. cmd = buf.Read();
  1256. }
  1257. CHECK_EXPECTED(cmd, EndListSymbol);
  1258. if (packer) {
  1259. key = MakeString(packer->Pack(key));
  1260. }
  1261. map.emplace(std::move(key), std::move(payload));
  1262. cmd = buf.Read();
  1263. if (cmd == ListItemSeparatorSymbol) {
  1264. cmd = buf.Read();
  1265. }
  1266. }
  1267. };
  1268. const NUdf::IHash* hash = holderFactory.GetHash(*keyType, useIHash);
  1269. const NUdf::IEquate* equate = holderFactory.GetEquate(*keyType, useIHash);
  1270. return holderFactory.CreateDirectHashedDictHolder(filler, types, isTuple, true, encoded ? keyType : nullptr,
  1271. hash, equate);
  1272. }
  1273. }
  1274. case TType::EKind::Tuple: {
  1275. auto tupleType = static_cast<TTupleType*>(type);
  1276. NUdf::TUnboxedValue* items;
  1277. NUdf::TUnboxedValue ret = holderFactory.CreateDirectArrayHolder(tupleType->GetElementsCount(), items);
  1278. CHECK_EXPECTED(cmd, BeginListSymbol);
  1279. cmd = buf.Read();
  1280. for (ui32 i = 0; i < tupleType->GetElementsCount(); ++i) {
  1281. items[i] = ReadYsonValue(tupleType->GetElementType(i), nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat);
  1282. cmd = buf.Read();
  1283. if (cmd == ListItemSeparatorSymbol) {
  1284. cmd = buf.Read();
  1285. }
  1286. }
  1287. CHECK_EXPECTED(cmd, EndListSymbol);
  1288. return ret;
  1289. }
  1290. case TType::EKind::Void: {
  1291. if (cmd == EntitySymbol) {
  1292. return NUdf::TUnboxedValuePod::Void();
  1293. }
  1294. auto nextString = ReadNextString(cmd, buf);
  1295. YQL_ENSURE(nextString == NResult::TYsonResultWriter::VoidString, "Expected Void");
  1296. return NUdf::TUnboxedValuePod::Void();
  1297. }
  1298. case TType::EKind::Null: {
  1299. CHECK_EXPECTED(cmd, EntitySymbol);
  1300. return NUdf::TUnboxedValuePod();
  1301. }
  1302. case TType::EKind::EmptyList: {
  1303. CHECK_EXPECTED(cmd, BeginListSymbol);
  1304. cmd = buf.Read();
  1305. CHECK_EXPECTED(cmd, EndListSymbol);
  1306. return holderFactory.GetEmptyContainerLazy();
  1307. }
  1308. case TType::EKind::EmptyDict: {
  1309. YQL_ENSURE(cmd == BeginListSymbol || cmd == BeginMapSymbol, "Expected '{' or '[', but read: " << TString(cmd).Quote());
  1310. if (cmd == BeginListSymbol) {
  1311. cmd = buf.Read();
  1312. CHECK_EXPECTED(cmd, EndListSymbol);
  1313. } else {
  1314. cmd = buf.Read();
  1315. CHECK_EXPECTED(cmd, EndMapSymbol);
  1316. }
  1317. return holderFactory.GetEmptyContainerLazy();
  1318. }
  1319. case TType::EKind::Pg: {
  1320. auto pgType = static_cast<TPgType*>(type);
  1321. return isTableFormat ? ReadYsonValueInTableFormatPg(pgType, cmd, buf) : ReadYsonValuePg(pgType, cmd, buf);
  1322. }
  1323. case TType::EKind::Tagged: {
  1324. auto taggedType = static_cast<TTaggedType*>(type);
  1325. return ReadYsonValue(taggedType->GetBaseType(), nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat);
  1326. }
  1327. default:
  1328. YQL_ENSURE(false, "Unsupported type: " << type->GetKindAsStr());
  1329. }
  1330. }
  1331. TMaybe<NUdf::TUnboxedValue> ParseYsonValue(const THolderFactory& holderFactory,
  1332. const TStringBuf& yson, TType* type, ui64 nativeYtTypeFlags, IOutputStream* err, bool isTableFormat) {
  1333. try {
  1334. class TReader : public IBlockReader {
  1335. public:
  1336. TReader(const TStringBuf& yson)
  1337. : Yson_(yson)
  1338. {}
  1339. void SetDeadline(TInstant deadline) override {
  1340. Y_UNUSED(deadline);
  1341. }
  1342. std::pair<const char*, const char*> NextFilledBlock() override {
  1343. if (FirstBuffer_) {
  1344. FirstBuffer_ = false;
  1345. return{ Yson_.begin(), Yson_.end() };
  1346. }
  1347. else {
  1348. return{ nullptr, nullptr };
  1349. }
  1350. }
  1351. void ReturnBlock() override {
  1352. }
  1353. bool Retry(const TMaybe<ui32>& rangeIndex, const TMaybe<ui64>& rowIndex, const std::exception_ptr& error) override {
  1354. Y_UNUSED(rangeIndex);
  1355. Y_UNUSED(rowIndex);
  1356. Y_UNUSED(error);
  1357. return false;
  1358. }
  1359. private:
  1360. TStringBuf Yson_;
  1361. bool FirstBuffer_ = true;
  1362. };
  1363. TReader reader(yson);
  1364. TInputBuf buf(reader, nullptr);
  1365. char cmd = buf.Read();
  1366. return ReadYsonValue(type, nativeYtTypeFlags, holderFactory, cmd, buf, isTableFormat);
  1367. }
  1368. catch (const yexception& e) {
  1369. if (err) {
  1370. *err << "YSON parsing failed: " << e.what();
  1371. }
  1372. return Nothing();
  1373. }
  1374. }
  1375. TMaybe<NUdf::TUnboxedValue> ParseYsonNode(const THolderFactory& holderFactory,
  1376. const NYT::TNode& node, TType* type, ui64 nativeYtTypeFlags, IOutputStream* err) {
  1377. return ParseYsonValue(holderFactory, NYT::NodeToYsonString(node, NYson::EYsonFormat::Binary), type, nativeYtTypeFlags, err, true);
  1378. }
  1379. TMaybe<NUdf::TUnboxedValue> ParseYsonNodeInResultFormat(const THolderFactory& holderFactory,
  1380. const NYT::TNode& node, TType* type, IOutputStream* err) {
  1381. return ParseYsonValue(holderFactory, NYT::NodeToYsonString(node, NYson::EYsonFormat::Binary), type, 0, err, false);
  1382. }
  1383. extern "C" void ReadYsonContainerValue(TType* type, ui64 nativeYtTypeFlags, const NKikimr::NMiniKQL::THolderFactory& holderFactory,
  1384. NUdf::TUnboxedValue& value, TInputBuf& buf, bool wrapOptional) {
  1385. // yson content
  1386. ui32 size;
  1387. buf.ReadMany((char*)&size, sizeof(size));
  1388. CHECK_STRING_LENGTH_UNSIGNED(size);
  1389. // parse binary yson...
  1390. YQL_ENSURE(size > 0);
  1391. char cmd = buf.Read();
  1392. auto tmp = ReadYsonValue(type, nativeYtTypeFlags, holderFactory, cmd, buf, true);
  1393. if (!wrapOptional) {
  1394. value = std::move(tmp);
  1395. }
  1396. else {
  1397. value = tmp.Release().MakeOptional();
  1398. }
  1399. }
  1400. NUdf::TUnboxedValue ReadSkiffData(TType* type, ui64 nativeYtTypeFlags, TInputBuf& buf) {
  1401. auto schemeType = static_cast<TDataType*>(type)->GetSchemeType();
  1402. switch (schemeType) {
  1403. case NUdf::TDataType<bool>::Id: {
  1404. ui8 data;
  1405. buf.ReadMany((char*)&data, sizeof(data));
  1406. return NUdf::TUnboxedValuePod(data != 0);
  1407. }
  1408. case NUdf::TDataType<ui8>::Id: {
  1409. ui64 data;
  1410. buf.ReadMany((char*)&data, sizeof(data));
  1411. return NUdf::TUnboxedValuePod(ui8(data));
  1412. }
  1413. case NUdf::TDataType<i8>::Id: {
  1414. i64 data;
  1415. buf.ReadMany((char*)&data, sizeof(data));
  1416. return NUdf::TUnboxedValuePod(i8(data));
  1417. }
  1418. case NUdf::TDataType<NUdf::TDate>::Id:
  1419. case NUdf::TDataType<ui16>::Id: {
  1420. ui64 data;
  1421. buf.ReadMany((char*)&data, sizeof(data));
  1422. return NUdf::TUnboxedValuePod(ui16(data));
  1423. }
  1424. case NUdf::TDataType<i16>::Id: {
  1425. i64 data;
  1426. buf.ReadMany((char*)&data, sizeof(data));
  1427. return NUdf::TUnboxedValuePod(i16(data));
  1428. }
  1429. case NUdf::TDataType<NUdf::TDate32>::Id:
  1430. case NUdf::TDataType<i32>::Id: {
  1431. i64 data;
  1432. buf.ReadMany((char*)&data, sizeof(data));
  1433. return NUdf::TUnboxedValuePod(i32(data));
  1434. }
  1435. case NUdf::TDataType<NUdf::TDatetime>::Id:
  1436. case NUdf::TDataType<ui32>::Id: {
  1437. ui64 data;
  1438. buf.ReadMany((char*)&data, sizeof(data));
  1439. return NUdf::TUnboxedValuePod(ui32(data));
  1440. }
  1441. case NUdf::TDataType<NUdf::TInterval>::Id:
  1442. case NUdf::TDataType<NUdf::TInterval64>::Id:
  1443. case NUdf::TDataType<NUdf::TDatetime64>::Id:
  1444. case NUdf::TDataType<NUdf::TTimestamp64>::Id:
  1445. case NUdf::TDataType<i64>::Id: {
  1446. i64 data;
  1447. buf.ReadMany((char*)&data, sizeof(data));
  1448. return NUdf::TUnboxedValuePod(data);
  1449. }
  1450. case NUdf::TDataType<NUdf::TTimestamp>::Id:
  1451. case NUdf::TDataType<ui64>::Id: {
  1452. ui64 data;
  1453. buf.ReadMany((char*)&data, sizeof(data));
  1454. return NUdf::TUnboxedValuePod(data);
  1455. }
  1456. case NUdf::TDataType<float>::Id: {
  1457. double data;
  1458. buf.ReadMany((char*)&data, sizeof(data));
  1459. return NUdf::TUnboxedValuePod(float(data));
  1460. }
  1461. case NUdf::TDataType<double>::Id: {
  1462. double data;
  1463. buf.ReadMany((char*)&data, sizeof(data));
  1464. return NUdf::TUnboxedValuePod(data);
  1465. }
  1466. case NUdf::TDataType<NUdf::TUtf8>::Id:
  1467. case NUdf::TDataType<char*>::Id:
  1468. case NUdf::TDataType<NUdf::TJson>::Id:
  1469. case NUdf::TDataType<NUdf::TYson>::Id:
  1470. case NUdf::TDataType<NUdf::TDyNumber>::Id:
  1471. case NUdf::TDataType<NUdf::TUuid>::Id: {
  1472. ui32 size;
  1473. buf.ReadMany((char*)&size, sizeof(size));
  1474. CHECK_STRING_LENGTH_UNSIGNED(size);
  1475. auto str = NUdf::TUnboxedValue(MakeStringNotFilled(size));
  1476. buf.ReadMany(str.AsStringRef().Data(), size);
  1477. return str;
  1478. }
  1479. case NUdf::TDataType<NUdf::TDecimal>::Id: {
  1480. if (nativeYtTypeFlags & NTCF_DECIMAL) {
  1481. auto const params = static_cast<TDataDecimalType*>(type)->GetParams();
  1482. if (params.first < 10) {
  1483. i32 data;
  1484. buf.ReadMany((char*)&data, sizeof(data));
  1485. return NUdf::TUnboxedValuePod(NDecimal::FromYtDecimal(data));
  1486. } else if (params.first < 19) {
  1487. i64 data;
  1488. buf.ReadMany((char*)&data, sizeof(data));
  1489. return NUdf::TUnboxedValuePod(NDecimal::FromYtDecimal(data));
  1490. } else {
  1491. YQL_ENSURE(params.first < 36);
  1492. NDecimal::TInt128 data;
  1493. buf.ReadMany((char*)&data, sizeof(data));
  1494. return NUdf::TUnboxedValuePod(NDecimal::FromYtDecimal(data));
  1495. }
  1496. } else {
  1497. ui32 size;
  1498. buf.ReadMany(reinterpret_cast<char*>(&size), sizeof(size));
  1499. const auto maxSize = sizeof(NDecimal::TInt128);
  1500. YQL_ENSURE(size > 0U && size <= maxSize, "Bad decimal field size: " << size);
  1501. char data[maxSize];
  1502. buf.ReadMany(data, size);
  1503. const auto& v = NDecimal::Deserialize(data, size);
  1504. YQL_ENSURE(!NDecimal::IsError(v.first), "Bad decimal field data: " << data);
  1505. YQL_ENSURE(size == v.second, "Bad decimal field size: " << size);
  1506. return NUdf::TUnboxedValuePod(v.first);
  1507. }
  1508. }
  1509. case NUdf::TDataType<NUdf::TTzDate>::Id: {
  1510. ui32 size;
  1511. buf.ReadMany((char*)&size, sizeof(size));
  1512. CHECK_STRING_LENGTH_UNSIGNED(size);
  1513. auto& vec = buf.YsonBuffer();
  1514. vec.resize(size);
  1515. buf.ReadMany(vec.data(), size);
  1516. ui16 value;
  1517. ui16 tzId;
  1518. YQL_ENSURE(DeserializeTzDate(TStringBuf(vec.begin(), vec.end()), value, tzId));
  1519. auto data = NUdf::TUnboxedValuePod(value);
  1520. data.SetTimezoneId(tzId);
  1521. return data;
  1522. }
  1523. case NUdf::TDataType<NUdf::TTzDatetime>::Id: {
  1524. ui32 size;
  1525. buf.ReadMany((char*)&size, sizeof(size));
  1526. CHECK_STRING_LENGTH_UNSIGNED(size);
  1527. auto& vec = buf.YsonBuffer();
  1528. vec.resize(size);
  1529. buf.ReadMany(vec.data(), size);
  1530. ui32 value;
  1531. ui16 tzId;
  1532. YQL_ENSURE(DeserializeTzDatetime(TStringBuf(vec.begin(), vec.end()), value, tzId));
  1533. auto data = NUdf::TUnboxedValuePod(value);
  1534. data.SetTimezoneId(tzId);
  1535. return data;
  1536. }
  1537. case NUdf::TDataType<NUdf::TTzTimestamp>::Id: {
  1538. ui32 size;
  1539. buf.ReadMany((char*)&size, sizeof(size));
  1540. CHECK_STRING_LENGTH_UNSIGNED(size);
  1541. auto& vec = buf.YsonBuffer();
  1542. vec.resize(size);
  1543. buf.ReadMany(vec.data(), size);
  1544. ui64 value;
  1545. ui16 tzId;
  1546. YQL_ENSURE(DeserializeTzTimestamp(TStringBuf(vec.begin(), vec.end()), value, tzId));
  1547. auto data = NUdf::TUnboxedValuePod(value);
  1548. data.SetTimezoneId(tzId);
  1549. return data;
  1550. }
  1551. case NUdf::TDataType<NUdf::TJsonDocument>::Id: {
  1552. ui32 size;
  1553. buf.ReadMany((char*)&size, sizeof(size));
  1554. CHECK_STRING_LENGTH_UNSIGNED(size);
  1555. auto json = NUdf::TUnboxedValue(MakeStringNotFilled(size));
  1556. buf.ReadMany(json.AsStringRef().Data(), size);
  1557. return ValueFromString(EDataSlot::JsonDocument, json.AsStringRef());
  1558. }
  1559. default:
  1560. YQL_ENSURE(false, "Unsupported data type: " << schemeType);
  1561. }
  1562. }
  1563. void SkipSkiffField(NKikimr::NMiniKQL::TType* type, ui64 nativeYtTypeFlags, TInputBuf& buf) {
  1564. const bool isOptional = type->IsOptional();
  1565. if (isOptional) {
  1566. // Unwrap optional
  1567. type = static_cast<TOptionalType*>(type)->GetItemType();
  1568. }
  1569. if (isOptional) {
  1570. auto marker = buf.Read();
  1571. if (!marker) {
  1572. return;
  1573. }
  1574. }
  1575. if (type->IsData()) {
  1576. auto schemeType = static_cast<TDataType*>(type)->GetSchemeType();
  1577. switch (schemeType) {
  1578. case NUdf::TDataType<bool>::Id:
  1579. buf.SkipMany(sizeof(ui8));
  1580. break;
  1581. case NUdf::TDataType<ui8>::Id:
  1582. case NUdf::TDataType<ui16>::Id:
  1583. case NUdf::TDataType<ui32>::Id:
  1584. case NUdf::TDataType<ui64>::Id:
  1585. case NUdf::TDataType<NUdf::TDate>::Id:
  1586. case NUdf::TDataType<NUdf::TDatetime>::Id:
  1587. case NUdf::TDataType<NUdf::TTimestamp>::Id:
  1588. buf.SkipMany(sizeof(ui64));
  1589. break;
  1590. case NUdf::TDataType<i8>::Id:
  1591. case NUdf::TDataType<i16>::Id:
  1592. case NUdf::TDataType<i32>::Id:
  1593. case NUdf::TDataType<i64>::Id:
  1594. case NUdf::TDataType<NUdf::TInterval>::Id:
  1595. case NUdf::TDataType<NUdf::TDate32>::Id:
  1596. case NUdf::TDataType<NUdf::TDatetime64>::Id:
  1597. case NUdf::TDataType<NUdf::TTimestamp64>::Id:
  1598. case NUdf::TDataType<NUdf::TInterval64>::Id:
  1599. buf.SkipMany(sizeof(i64));
  1600. break;
  1601. case NUdf::TDataType<float>::Id:
  1602. case NUdf::TDataType<double>::Id:
  1603. buf.SkipMany(sizeof(double));
  1604. break;
  1605. case NUdf::TDataType<NUdf::TUtf8>::Id:
  1606. case NUdf::TDataType<char*>::Id:
  1607. case NUdf::TDataType<NUdf::TJson>::Id:
  1608. case NUdf::TDataType<NUdf::TYson>::Id:
  1609. case NUdf::TDataType<NUdf::TUuid>::Id:
  1610. case NUdf::TDataType<NUdf::TDyNumber>::Id:
  1611. case NUdf::TDataType<NUdf::TTzDate>::Id:
  1612. case NUdf::TDataType<NUdf::TTzDatetime>::Id:
  1613. case NUdf::TDataType<NUdf::TTzTimestamp>::Id:
  1614. case NUdf::TDataType<NUdf::TJsonDocument>::Id: {
  1615. ui32 size;
  1616. buf.ReadMany((char*)&size, sizeof(size));
  1617. CHECK_STRING_LENGTH_UNSIGNED(size);
  1618. buf.SkipMany(size);
  1619. break;
  1620. }
  1621. case NUdf::TDataType<NUdf::TDecimal>::Id: {
  1622. if (nativeYtTypeFlags & NTCF_DECIMAL) {
  1623. auto const params = static_cast<TDataDecimalType*>(type)->GetParams();
  1624. if (params.first < 10) {
  1625. buf.SkipMany(sizeof(i32));
  1626. } else if (params.first < 19) {
  1627. buf.SkipMany(sizeof(i64));
  1628. } else {
  1629. buf.SkipMany(sizeof(NDecimal::TInt128));
  1630. }
  1631. } else {
  1632. ui32 size;
  1633. buf.ReadMany((char*)&size, sizeof(size));
  1634. CHECK_STRING_LENGTH_UNSIGNED(size);
  1635. buf.SkipMany(size);
  1636. }
  1637. break;
  1638. }
  1639. default:
  1640. YQL_ENSURE(false, "Unsupported data type: " << schemeType);
  1641. }
  1642. return;
  1643. }
  1644. if (type->IsPg()) {
  1645. SkipSkiffPg(static_cast<TPgType*>(type), buf);
  1646. return;
  1647. }
  1648. if (type->IsStruct()) {
  1649. auto structType = static_cast<TStructType*>(type);
  1650. const std::vector<size_t>* reorder = nullptr;
  1651. if (auto cookie = structType->GetCookie()) {
  1652. reorder = ((const std::vector<size_t>*)cookie);
  1653. }
  1654. for (ui32 i = 0; i < structType->GetMembersCount(); ++i) {
  1655. SkipSkiffField(structType->GetMemberType(reorder ? reorder->at(i) : i), nativeYtTypeFlags, buf);
  1656. }
  1657. return;
  1658. }
  1659. if (type->IsList()) {
  1660. auto itemType = static_cast<TListType*>(type)->GetItemType();
  1661. while (buf.Read() == '\0') {
  1662. SkipSkiffField(itemType, nativeYtTypeFlags, buf);
  1663. }
  1664. return;
  1665. }
  1666. if (type->IsTuple()) {
  1667. auto tupleType = static_cast<TTupleType*>(type);
  1668. for (ui32 i = 0; i < tupleType->GetElementsCount(); ++i) {
  1669. SkipSkiffField(tupleType->GetElementType(i), nativeYtTypeFlags, buf);
  1670. }
  1671. return;
  1672. }
  1673. if (type->IsVariant()) {
  1674. auto varType = AS_TYPE(TVariantType, type);
  1675. ui16 data = 0;
  1676. if (varType->GetAlternativesCount() < 256) {
  1677. buf.ReadMany((char*)&data, 1);
  1678. } else {
  1679. buf.ReadMany((char*)&data, sizeof(data));
  1680. }
  1681. if (varType->GetUnderlyingType()->IsTuple()) {
  1682. auto tupleType = AS_TYPE(TTupleType, varType->GetUnderlyingType());
  1683. YQL_ENSURE(data < tupleType->GetElementsCount());
  1684. SkipSkiffField(tupleType->GetElementType(data), nativeYtTypeFlags, buf);
  1685. } else {
  1686. auto structType = AS_TYPE(TStructType, varType->GetUnderlyingType());
  1687. if (auto cookie = structType->GetCookie()) {
  1688. const std::vector<size_t>& reorder = *((const std::vector<size_t>*)cookie);
  1689. data = reorder[data];
  1690. }
  1691. YQL_ENSURE(data < structType->GetMembersCount());
  1692. SkipSkiffField(structType->GetMemberType(data), nativeYtTypeFlags, buf);
  1693. }
  1694. return;
  1695. }
  1696. if (type->IsVoid()) {
  1697. return;
  1698. }
  1699. if (type->IsNull()) {
  1700. return;
  1701. }
  1702. if (type->IsEmptyList() || type->IsEmptyDict()) {
  1703. return;
  1704. }
  1705. if (type->IsDict()) {
  1706. auto dictType = AS_TYPE(TDictType, type);
  1707. auto keyType = dictType->GetKeyType();
  1708. auto payloadType = dictType->GetPayloadType();
  1709. while (buf.Read() == '\0') {
  1710. SkipSkiffField(keyType, nativeYtTypeFlags, buf);
  1711. SkipSkiffField(payloadType, nativeYtTypeFlags, buf);
  1712. }
  1713. return;
  1714. }
  1715. YQL_ENSURE(false, "Unsupported type for skip: " << type->GetKindAsStr());
  1716. }
  1717. NKikimr::NUdf::TUnboxedValue ReadSkiffNativeYtValue(NKikimr::NMiniKQL::TType* type, ui64 nativeYtTypeFlags,
  1718. const NKikimr::NMiniKQL::THolderFactory& holderFactory, TInputBuf& buf)
  1719. {
  1720. if (type->IsData()) {
  1721. return ReadSkiffData(type, nativeYtTypeFlags, buf);
  1722. }
  1723. if (type->IsPg()) {
  1724. return ReadSkiffPg(static_cast<TPgType*>(type), buf);
  1725. }
  1726. if (type->IsOptional()) {
  1727. auto marker = buf.Read();
  1728. if (!marker) {
  1729. return NUdf::TUnboxedValue();
  1730. }
  1731. auto value = ReadSkiffNativeYtValue(AS_TYPE(TOptionalType, type)->GetItemType(), nativeYtTypeFlags, holderFactory, buf);
  1732. return value.Release().MakeOptional();
  1733. }
  1734. if (type->IsTuple()) {
  1735. auto tupleType = AS_TYPE(TTupleType, type);
  1736. NUdf::TUnboxedValue* items;
  1737. auto value = holderFactory.CreateDirectArrayHolder(tupleType->GetElementsCount(), items);
  1738. for (ui32 i = 0; i < tupleType->GetElementsCount(); ++i) {
  1739. items[i] = ReadSkiffNativeYtValue(tupleType->GetElementType(i), nativeYtTypeFlags, holderFactory, buf);
  1740. }
  1741. return value;
  1742. }
  1743. if (type->IsStruct()) {
  1744. auto structType = AS_TYPE(TStructType, type);
  1745. NUdf::TUnboxedValue* items;
  1746. auto value = holderFactory.CreateDirectArrayHolder(structType->GetMembersCount(), items);
  1747. if (auto cookie = type->GetCookie()) {
  1748. const std::vector<size_t>& reorder = *((const std::vector<size_t>*)cookie);
  1749. for (ui32 i = 0; i < structType->GetMembersCount(); ++i) {
  1750. const auto ndx = reorder[i];
  1751. items[ndx] = ReadSkiffNativeYtValue(structType->GetMemberType(ndx), nativeYtTypeFlags, holderFactory, buf);
  1752. }
  1753. } else {
  1754. for (ui32 i = 0; i < structType->GetMembersCount(); ++i) {
  1755. items[i] = ReadSkiffNativeYtValue(structType->GetMemberType(i), nativeYtTypeFlags, holderFactory, buf);
  1756. }
  1757. }
  1758. return value;
  1759. }
  1760. if (type->IsList()) {
  1761. auto itemType = AS_TYPE(TListType, type)->GetItemType();
  1762. TDefaultListRepresentation items;
  1763. while (buf.Read() == '\0') {
  1764. items = items.Append(ReadSkiffNativeYtValue(itemType, nativeYtTypeFlags, holderFactory, buf));
  1765. }
  1766. return holderFactory.CreateDirectListHolder(std::move(items));
  1767. }
  1768. if (type->IsVariant()) {
  1769. auto varType = AS_TYPE(TVariantType, type);
  1770. ui16 data = 0;
  1771. if (varType->GetAlternativesCount() < 256) {
  1772. buf.ReadMany((char*)&data, 1);
  1773. } else {
  1774. buf.ReadMany((char*)&data, sizeof(data));
  1775. }
  1776. if (varType->GetUnderlyingType()->IsTuple()) {
  1777. auto tupleType = AS_TYPE(TTupleType, varType->GetUnderlyingType());
  1778. YQL_ENSURE(data < tupleType->GetElementsCount());
  1779. auto item = ReadSkiffNativeYtValue(tupleType->GetElementType(data), nativeYtTypeFlags, holderFactory, buf);
  1780. return holderFactory.CreateVariantHolder(item.Release(), data);
  1781. }
  1782. else {
  1783. auto structType = AS_TYPE(TStructType, varType->GetUnderlyingType());
  1784. if (auto cookie = structType->GetCookie()) {
  1785. const std::vector<size_t>& reorder = *((const std::vector<size_t>*)cookie);
  1786. data = reorder[data];
  1787. }
  1788. YQL_ENSURE(data < structType->GetMembersCount());
  1789. auto item = ReadSkiffNativeYtValue(structType->GetMemberType(data), nativeYtTypeFlags, holderFactory, buf);
  1790. return holderFactory.CreateVariantHolder(item.Release(), data);
  1791. }
  1792. }
  1793. if (type->IsVoid()) {
  1794. return NUdf::TUnboxedValue::Zero();
  1795. }
  1796. if (type->IsNull()) {
  1797. return NUdf::TUnboxedValue();
  1798. }
  1799. if (type->IsEmptyList() || type->IsEmptyDict()) {
  1800. return holderFactory.GetEmptyContainerLazy();
  1801. }
  1802. if (type->IsDict()) {
  1803. auto dictType = AS_TYPE(TDictType, type);
  1804. auto keyType = dictType->GetKeyType();
  1805. auto payloadType = dictType->GetPayloadType();
  1806. auto builder = holderFactory.NewDict(dictType, NUdf::TDictFlags::EDictKind::Hashed);
  1807. while (buf.Read() == '\0') {
  1808. auto key = ReadSkiffNativeYtValue(keyType, nativeYtTypeFlags, holderFactory, buf);
  1809. auto payload = ReadSkiffNativeYtValue(payloadType, nativeYtTypeFlags, holderFactory, buf);
  1810. builder->Add(std::move(key), std::move(payload));
  1811. }
  1812. return builder->Build();
  1813. }
  1814. YQL_ENSURE(false, "Unsupported type: " << type->GetKindAsStr());
  1815. }
  1816. extern "C" void ReadContainerNativeYtValue(TType* type, ui64 nativeYtTypeFlags, const NKikimr::NMiniKQL::THolderFactory& holderFactory,
  1817. NUdf::TUnboxedValue& value, TInputBuf& buf, bool wrapOptional) {
  1818. auto tmp = ReadSkiffNativeYtValue(type, nativeYtTypeFlags, holderFactory, buf);
  1819. if (!wrapOptional) {
  1820. value = std::move(tmp);
  1821. } else {
  1822. value = tmp.Release().MakeOptional();
  1823. }
  1824. }
  1825. ///////////////////////////////////////////
  1826. //
  1827. // Initial state first = last = &dummy
  1828. //
  1829. // +1 block first = &dummy, last = newPage, first.next = newPage, newPage.next= &dummy
  1830. // +1 block first = &dummy, last = newPage2, first.next = newPage, newPage.next = newPage2, newPage2.next = &dummy
  1831. //
  1832. ///////////////////////////////////////////
  1833. class TTempBlockWriter : public NCommon::IBlockWriter {
  1834. public:
  1835. TTempBlockWriter()
  1836. : Pool_(*TlsAllocState)
  1837. , Last_(&Dummy_)
  1838. {
  1839. Dummy_.Avail_ = 0;
  1840. Dummy_.Next_ = &Dummy_;
  1841. }
  1842. ~TTempBlockWriter() {
  1843. auto current = Dummy_.Next_; // skip dummy node
  1844. while (current != &Dummy_) {
  1845. auto next = current->Next_;
  1846. Pool_.ReturnPage(current);
  1847. current = next;
  1848. }
  1849. }
  1850. void SetRecordBoundaryCallback(std::function<void()> callback) override {
  1851. Y_UNUSED(callback);
  1852. }
  1853. void WriteBlocks(TOutputBuf& buf) const {
  1854. auto current = Dummy_.Next_; // skip dummy node
  1855. while (current != &Dummy_) {
  1856. auto next = current->Next_;
  1857. buf.WriteMany((const char*)(current + 1), current->Avail_);
  1858. current = next;
  1859. }
  1860. }
  1861. TTempBlockWriter(const TTempBlockWriter&) = delete;
  1862. void operator=(const TTempBlockWriter&) = delete;
  1863. std::pair<char*, char*> NextEmptyBlock() override {
  1864. auto newPage = Pool_.GetPage();
  1865. auto header = (TPageHeader*)newPage;
  1866. header->Avail_ = 0;
  1867. header->Next_ = &Dummy_;
  1868. Last_->Next_ = header;
  1869. Last_ = header;
  1870. return std::make_pair((char*)(header + 1), (char*)newPage + TAlignedPagePool::POOL_PAGE_SIZE);
  1871. }
  1872. void ReturnBlock(size_t avail, std::optional<size_t> lastRecordBoundary) override {
  1873. Y_UNUSED(lastRecordBoundary);
  1874. YQL_ENSURE(avail <= TAlignedPagePool::POOL_PAGE_SIZE - sizeof(TPageHeader));
  1875. Last_->Avail_ = avail;
  1876. }
  1877. void Finish() override {
  1878. }
  1879. private:
  1880. struct TPageHeader {
  1881. TPageHeader* Next_ = nullptr;
  1882. ui32 Avail_ = 0;
  1883. };
  1884. NKikimr::TAlignedPagePool& Pool_;
  1885. TPageHeader* Last_;
  1886. TPageHeader Dummy_;
  1887. };
  1888. void WriteYsonValueInTableFormat(TOutputBuf& buf, TType* type, ui64 nativeYtTypeFlags, const NUdf::TUnboxedValuePod& value, bool topLevel) {
  1889. // Table format, very compact
  1890. switch (type->GetKind()) {
  1891. case TType::EKind::Variant: {
  1892. buf.Write(BeginListSymbol);
  1893. auto varType = static_cast<TVariantType*>(type);
  1894. auto underlyingType = varType->GetUnderlyingType();
  1895. auto index = value.GetVariantIndex();
  1896. YQL_ENSURE(index < varType->GetAlternativesCount(), "Bad variant alternative: " << index << ", only " << varType->GetAlternativesCount() << " are available");
  1897. YQL_ENSURE(underlyingType->IsTuple() || underlyingType->IsStruct(), "Wrong underlying type");
  1898. TType* itemType;
  1899. if (underlyingType->IsTuple()) {
  1900. itemType = static_cast<TTupleType*>(underlyingType)->GetElementType(index);
  1901. }
  1902. else {
  1903. itemType = static_cast<TStructType*>(underlyingType)->GetMemberType(index);
  1904. }
  1905. if (!(nativeYtTypeFlags & NTCF_COMPLEX) || underlyingType->IsTuple()) {
  1906. buf.Write(Uint64Marker);
  1907. buf.WriteVarUI64(index);
  1908. } else {
  1909. auto structType = static_cast<TStructType*>(underlyingType);
  1910. auto varName = structType->GetMemberName(index);
  1911. buf.Write(StringMarker);
  1912. buf.WriteVarI32(varName.size());
  1913. buf.WriteMany(varName);
  1914. }
  1915. buf.Write(ListItemSeparatorSymbol);
  1916. WriteYsonValueInTableFormat(buf, itemType, nativeYtTypeFlags, value.GetVariantItem(), false);
  1917. buf.Write(ListItemSeparatorSymbol);
  1918. buf.Write(EndListSymbol);
  1919. break;
  1920. }
  1921. case TType::EKind::Data: {
  1922. auto schemeType = static_cast<TDataType*>(type)->GetSchemeType();
  1923. switch (schemeType) {
  1924. case NUdf::TDataType<bool>::Id: {
  1925. buf.Write(value.Get<bool>() ? TrueMarker : FalseMarker);
  1926. break;
  1927. }
  1928. case NUdf::TDataType<ui8>::Id:
  1929. buf.Write(Uint64Marker);
  1930. buf.WriteVarUI64(value.Get<ui8>());
  1931. break;
  1932. case NUdf::TDataType<i8>::Id:
  1933. buf.Write(Int64Marker);
  1934. buf.WriteVarI64(value.Get<i8>());
  1935. break;
  1936. case NUdf::TDataType<ui16>::Id:
  1937. buf.Write(Uint64Marker);
  1938. buf.WriteVarUI64(value.Get<ui16>());
  1939. break;
  1940. case NUdf::TDataType<i16>::Id:
  1941. buf.Write(Int64Marker);
  1942. buf.WriteVarI64(value.Get<i16>());
  1943. break;
  1944. case NUdf::TDataType<i32>::Id:
  1945. buf.Write(Int64Marker);
  1946. buf.WriteVarI64(value.Get<i32>());
  1947. break;
  1948. case NUdf::TDataType<ui32>::Id:
  1949. buf.Write(Uint64Marker);
  1950. buf.WriteVarUI64(value.Get<ui32>());
  1951. break;
  1952. case NUdf::TDataType<i64>::Id:
  1953. buf.Write(Int64Marker);
  1954. buf.WriteVarI64(value.Get<i64>());
  1955. break;
  1956. case NUdf::TDataType<ui64>::Id:
  1957. buf.Write(Uint64Marker);
  1958. buf.WriteVarUI64(value.Get<ui64>());
  1959. break;
  1960. case NUdf::TDataType<float>::Id: {
  1961. buf.Write(DoubleMarker);
  1962. double val = value.Get<float>();
  1963. buf.WriteMany((const char*)&val, sizeof(val));
  1964. break;
  1965. }
  1966. case NUdf::TDataType<double>::Id: {
  1967. buf.Write(DoubleMarker);
  1968. double val = value.Get<double>();
  1969. buf.WriteMany((const char*)&val, sizeof(val));
  1970. break;
  1971. }
  1972. case NUdf::TDataType<NUdf::TUtf8>::Id:
  1973. case NUdf::TDataType<char*>::Id:
  1974. case NUdf::TDataType<NUdf::TJson>::Id:
  1975. case NUdf::TDataType<NUdf::TDyNumber>::Id:
  1976. case NUdf::TDataType<NUdf::TUuid>::Id: {
  1977. buf.Write(StringMarker);
  1978. auto str = value.AsStringRef();
  1979. buf.WriteVarI32(str.Size());
  1980. buf.WriteMany(str);
  1981. break;
  1982. }
  1983. case NUdf::TDataType<NUdf::TDecimal>::Id: {
  1984. buf.Write(StringMarker);
  1985. if (nativeYtTypeFlags & NTCF_DECIMAL){
  1986. auto const params = static_cast<TDataDecimalType*>(type)->GetParams();
  1987. const NDecimal::TInt128 data128 = value.GetInt128();
  1988. char tmpBuf[NYT::NDecimal::TDecimal::MaxBinarySize];
  1989. if (params.first < 10) {
  1990. // The YQL format differs from the YT format in the inf/nan values. NDecimal::FromYtDecimal converts nan/inf
  1991. TStringBuf resBuf = NYT::NDecimal::TDecimal::WriteBinary32(params.first, NDecimal::ToYtDecimal<i32>(data128), tmpBuf, NYT::NDecimal::TDecimal::MaxBinarySize);
  1992. buf.WriteVarI32(resBuf.size());
  1993. buf.WriteMany(resBuf.data(), resBuf.size());
  1994. } else if (params.first < 19) {
  1995. TStringBuf resBuf = NYT::NDecimal::TDecimal::WriteBinary64(params.first, NDecimal::ToYtDecimal<i64>(data128), tmpBuf, NYT::NDecimal::TDecimal::MaxBinarySize);
  1996. buf.WriteVarI32(resBuf.size());
  1997. buf.WriteMany(resBuf.data(), resBuf.size());
  1998. } else {
  1999. YQL_ENSURE(params.first < 36);
  2000. NYT::NDecimal::TDecimal::TValue128 val;
  2001. auto data128Converted = NDecimal::ToYtDecimal<NDecimal::TInt128>(data128);
  2002. memcpy(&val, &data128Converted, sizeof(val));
  2003. auto resBuf = NYT::NDecimal::TDecimal::WriteBinary128(params.first, val, tmpBuf, NYT::NDecimal::TDecimal::MaxBinarySize);
  2004. buf.WriteVarI32(resBuf.size());
  2005. buf.WriteMany(resBuf.data(), resBuf.size());
  2006. }
  2007. } else {
  2008. char data[sizeof(NDecimal::TInt128)];
  2009. const ui32 size = NDecimal::Serialize(value.GetInt128(), data);
  2010. buf.WriteVarI32(size);
  2011. buf.WriteMany(data, size);
  2012. }
  2013. break;
  2014. }
  2015. case NUdf::TDataType<NUdf::TYson>::Id: {
  2016. // embed content
  2017. buf.WriteMany(value.AsStringRef());
  2018. break;
  2019. }
  2020. case NUdf::TDataType<NUdf::TDate>::Id:
  2021. buf.Write(Uint64Marker);
  2022. buf.WriteVarUI64(value.Get<ui16>());
  2023. break;
  2024. case NUdf::TDataType<NUdf::TDatetime>::Id:
  2025. buf.Write(Uint64Marker);
  2026. buf.WriteVarUI64(value.Get<ui32>());
  2027. break;
  2028. case NUdf::TDataType<NUdf::TTimestamp>::Id:
  2029. buf.Write(Uint64Marker);
  2030. buf.WriteVarUI64(value.Get<ui64>());
  2031. break;
  2032. case NUdf::TDataType<NUdf::TInterval>::Id:
  2033. case NUdf::TDataType<NUdf::TInterval64>::Id:
  2034. case NUdf::TDataType<NUdf::TDatetime64>::Id:
  2035. case NUdf::TDataType<NUdf::TTimestamp64>::Id:
  2036. buf.Write(Int64Marker);
  2037. buf.WriteVarI64(value.Get<i64>());
  2038. break;
  2039. case NUdf::TDataType<NUdf::TDate32>::Id:
  2040. buf.Write(Int64Marker);
  2041. buf.WriteVarI64(value.Get<i32>());
  2042. break;
  2043. case NUdf::TDataType<NUdf::TTzDate>::Id: {
  2044. ui16 tzId = SwapBytes(value.GetTimezoneId());
  2045. ui16 data = SwapBytes(value.Get<ui16>());
  2046. ui32 size = sizeof(data) + sizeof(tzId);
  2047. buf.Write(StringMarker);
  2048. buf.WriteVarI32(size);
  2049. buf.WriteMany((const char*)&data, sizeof(data));
  2050. buf.WriteMany((const char*)&tzId, sizeof(tzId));
  2051. break;
  2052. }
  2053. case NUdf::TDataType<NUdf::TTzDatetime>::Id: {
  2054. ui16 tzId = SwapBytes(value.GetTimezoneId());
  2055. ui32 data = SwapBytes(value.Get<ui32>());
  2056. ui32 size = sizeof(data) + sizeof(tzId);
  2057. buf.Write(StringMarker);
  2058. buf.WriteVarI32(size);
  2059. buf.WriteMany((const char*)&data, sizeof(data));
  2060. buf.WriteMany((const char*)&tzId, sizeof(tzId));
  2061. break;
  2062. }
  2063. case NUdf::TDataType<NUdf::TTzTimestamp>::Id: {
  2064. ui16 tzId = SwapBytes(value.GetTimezoneId());
  2065. ui64 data = SwapBytes(value.Get<ui64>());
  2066. ui32 size = sizeof(data) + sizeof(tzId);
  2067. buf.Write(StringMarker);
  2068. buf.WriteVarI32(size);
  2069. buf.WriteMany((const char*)&data, sizeof(data));
  2070. buf.WriteMany((const char*)&tzId, sizeof(tzId));
  2071. break;
  2072. }
  2073. case NUdf::TDataType<NUdf::TTzDate32>::Id: {
  2074. ui16 tzId = SwapBytes(value.GetTimezoneId());
  2075. ui32 data = 0x80 ^ SwapBytes((ui32)value.Get<i32>());
  2076. ui32 size = sizeof(data) + sizeof(tzId);
  2077. buf.Write(StringMarker);
  2078. buf.WriteVarI32(size);
  2079. buf.WriteMany((const char*)&data, sizeof(data));
  2080. buf.WriteMany((const char*)&tzId, sizeof(tzId));
  2081. break;
  2082. }
  2083. case NUdf::TDataType<NUdf::TTzDatetime64>::Id: {
  2084. ui16 tzId = SwapBytes(value.GetTimezoneId());
  2085. ui64 data = 0x80 ^ SwapBytes((ui64)value.Get<i64>());
  2086. ui32 size = sizeof(data) + sizeof(tzId);
  2087. buf.Write(StringMarker);
  2088. buf.WriteVarI32(size);
  2089. buf.WriteMany((const char*)&data, sizeof(data));
  2090. buf.WriteMany((const char*)&tzId, sizeof(tzId));
  2091. break;
  2092. }
  2093. case NUdf::TDataType<NUdf::TTzTimestamp64>::Id: {
  2094. ui16 tzId = SwapBytes(value.GetTimezoneId());
  2095. ui64 data = 0x80 ^ SwapBytes((ui64)value.Get<i64>());
  2096. ui32 size = sizeof(data) + sizeof(tzId);
  2097. buf.Write(StringMarker);
  2098. buf.WriteVarI32(size);
  2099. buf.WriteMany((const char*)&data, sizeof(data));
  2100. buf.WriteMany((const char*)&tzId, sizeof(tzId));
  2101. break;
  2102. }
  2103. case NUdf::TDataType<NUdf::TJsonDocument>::Id: {
  2104. buf.Write(StringMarker);
  2105. NUdf::TUnboxedValue json = ValueToString(EDataSlot::JsonDocument, value);
  2106. auto str = json.AsStringRef();
  2107. buf.WriteVarI32(str.Size());
  2108. buf.WriteMany(str);
  2109. break;
  2110. }
  2111. default:
  2112. YQL_ENSURE(false, "Unsupported data type: " << schemeType);
  2113. }
  2114. break;
  2115. }
  2116. case TType::EKind::Struct: {
  2117. auto structType = static_cast<TStructType*>(type);
  2118. if (nativeYtTypeFlags & ENativeTypeCompatFlags::NTCF_COMPLEX) {
  2119. buf.Write(BeginMapSymbol);
  2120. for (ui32 i = 0; i < structType->GetMembersCount(); ++i) {
  2121. buf.Write(StringMarker);
  2122. auto key = structType->GetMemberName(i);
  2123. buf.WriteVarI32(key.size());
  2124. buf.WriteMany(key);
  2125. buf.Write(KeyValueSeparatorSymbol);
  2126. WriteYsonValueInTableFormat(buf, structType->GetMemberType(i), nativeYtTypeFlags, value.GetElement(i), false);
  2127. buf.Write(KeyedItemSeparatorSymbol);
  2128. }
  2129. buf.Write(EndMapSymbol);
  2130. } else {
  2131. buf.Write(BeginListSymbol);
  2132. for (ui32 i = 0; i < structType->GetMembersCount(); ++i) {
  2133. WriteYsonValueInTableFormat(buf, structType->GetMemberType(i), nativeYtTypeFlags, value.GetElement(i), false);
  2134. buf.Write(ListItemSeparatorSymbol);
  2135. }
  2136. buf.Write(EndListSymbol);
  2137. }
  2138. break;
  2139. }
  2140. case TType::EKind::List: {
  2141. auto itemType = static_cast<TListType*>(type)->GetItemType();
  2142. const auto iter = value.GetListIterator();
  2143. buf.Write(BeginListSymbol);
  2144. for (NUdf::TUnboxedValue item; iter.Next(item); buf.Write(ListItemSeparatorSymbol)) {
  2145. WriteYsonValueInTableFormat(buf, itemType, nativeYtTypeFlags, item, false);
  2146. }
  2147. buf.Write(EndListSymbol);
  2148. break;
  2149. }
  2150. case TType::EKind::Optional: {
  2151. auto itemType = static_cast<TOptionalType*>(type)->GetItemType();
  2152. if (nativeYtTypeFlags & ENativeTypeCompatFlags::NTCF_COMPLEX) {
  2153. if (value) {
  2154. if (itemType->GetKind() == TType::EKind::Optional || itemType->GetKind() == TType::EKind::Pg) {
  2155. buf.Write(BeginListSymbol);
  2156. }
  2157. WriteYsonValueInTableFormat(buf, itemType, nativeYtTypeFlags, value.GetOptionalValue(), false);
  2158. if (itemType->GetKind() == TType::EKind::Optional || itemType->GetKind() == TType::EKind::Pg) {
  2159. buf.Write(ListItemSeparatorSymbol);
  2160. buf.Write(EndListSymbol);
  2161. }
  2162. } else {
  2163. buf.Write(EntitySymbol);
  2164. }
  2165. } else {
  2166. if (!value) {
  2167. if (topLevel) {
  2168. buf.Write(BeginListSymbol);
  2169. buf.Write(EndListSymbol);
  2170. }
  2171. else {
  2172. buf.Write(EntitySymbol);
  2173. }
  2174. }
  2175. else {
  2176. buf.Write(BeginListSymbol);
  2177. WriteYsonValueInTableFormat(buf, itemType, nativeYtTypeFlags, value.GetOptionalValue(), false);
  2178. buf.Write(ListItemSeparatorSymbol);
  2179. buf.Write(EndListSymbol);
  2180. }
  2181. }
  2182. break;
  2183. }
  2184. case TType::EKind::Dict: {
  2185. auto dictType = static_cast<TDictType*>(type);
  2186. const auto iter = value.GetDictIterator();
  2187. buf.Write(BeginListSymbol);
  2188. for (NUdf::TUnboxedValue key, payload; iter.NextPair(key, payload);) {
  2189. buf.Write(BeginListSymbol);
  2190. WriteYsonValueInTableFormat(buf, dictType->GetKeyType(), nativeYtTypeFlags, key, false);
  2191. buf.Write(ListItemSeparatorSymbol);
  2192. WriteYsonValueInTableFormat(buf, dictType->GetPayloadType(), nativeYtTypeFlags, payload, false);
  2193. buf.Write(ListItemSeparatorSymbol);
  2194. buf.Write(EndListSymbol);
  2195. buf.Write(ListItemSeparatorSymbol);
  2196. }
  2197. buf.Write(EndListSymbol);
  2198. break;
  2199. }
  2200. case TType::EKind::Tuple: {
  2201. auto tupleType = static_cast<TTupleType*>(type);
  2202. buf.Write(BeginListSymbol);
  2203. for (ui32 i = 0; i < tupleType->GetElementsCount(); ++i) {
  2204. WriteYsonValueInTableFormat(buf, tupleType->GetElementType(i), nativeYtTypeFlags, value.GetElement(i), false);
  2205. buf.Write(ListItemSeparatorSymbol);
  2206. }
  2207. buf.Write(EndListSymbol);
  2208. break;
  2209. }
  2210. case TType::EKind::Void: {
  2211. buf.Write(EntitySymbol);
  2212. break;
  2213. }
  2214. case TType::EKind::Null: {
  2215. buf.Write(EntitySymbol);
  2216. break;
  2217. }
  2218. case TType::EKind::EmptyList: {
  2219. buf.Write(BeginListSymbol);
  2220. buf.Write(EndListSymbol);
  2221. break;
  2222. }
  2223. case TType::EKind::EmptyDict: {
  2224. buf.Write(BeginListSymbol);
  2225. buf.Write(EndListSymbol);
  2226. break;
  2227. }
  2228. case TType::EKind::Pg: {
  2229. auto pgType = static_cast<TPgType*>(type);
  2230. WriteYsonValueInTableFormatPg(buf, pgType, value, topLevel);
  2231. break;
  2232. }
  2233. default:
  2234. YQL_ENSURE(false, "Unsupported type: " << type->GetKindAsStr());
  2235. }
  2236. }
  2237. extern "C" void WriteYsonContainerValue(TType* type, ui64 nativeYtTypeFlags, const NUdf::TUnboxedValuePod& value, TOutputBuf& buf) {
  2238. TTempBlockWriter blockWriter;
  2239. TOutputBuf ysonBuf(blockWriter, nullptr);
  2240. WriteYsonValueInTableFormat(ysonBuf, type, nativeYtTypeFlags, value, true);
  2241. ysonBuf.Flush();
  2242. ui32 size = ysonBuf.GetWrittenBytes();
  2243. buf.WriteMany((const char*)&size, sizeof(size));
  2244. blockWriter.WriteBlocks(buf);
  2245. }
  2246. extern "C" void WriteContainerNativeYtValue(TType* type, ui64 nativeYtTypeFlags, const NUdf::TUnboxedValuePod& value, TOutputBuf& buf) {
  2247. WriteSkiffNativeYtValue(type, nativeYtTypeFlags, value, buf);
  2248. }
  2249. void WriteSkiffData(NKikimr::NMiniKQL::TType* type, ui64 nativeYtTypeFlags, const NKikimr::NUdf::TUnboxedValuePod& value, NCommon::TOutputBuf& buf) {
  2250. auto schemeType = static_cast<TDataType*>(type)->GetSchemeType();
  2251. switch (schemeType) {
  2252. case NUdf::TDataType<bool>::Id: {
  2253. ui8 data = value.Get<ui8>();
  2254. buf.Write(data);
  2255. break;
  2256. }
  2257. case NUdf::TDataType<ui8>::Id: {
  2258. ui64 data = value.Get<ui8>();
  2259. buf.WriteMany((const char*)&data, sizeof(data));
  2260. break;
  2261. }
  2262. case NUdf::TDataType<i8>::Id: {
  2263. i64 data = value.Get<i8>();
  2264. buf.WriteMany((const char*)&data, sizeof(data));
  2265. break;
  2266. }
  2267. case NUdf::TDataType<NUdf::TDate>::Id:
  2268. case NUdf::TDataType<ui16>::Id: {
  2269. ui64 data = value.Get<ui16>();
  2270. buf.WriteMany((const char*)&data, sizeof(data));
  2271. break;
  2272. }
  2273. case NUdf::TDataType<i16>::Id: {
  2274. i64 data = value.Get<i16>();
  2275. buf.WriteMany((const char*)&data, sizeof(data));
  2276. break;
  2277. }
  2278. case NUdf::TDataType<NUdf::TDate32>::Id:
  2279. case NUdf::TDataType<i32>::Id: {
  2280. i64 data = value.Get<i32>();
  2281. buf.WriteMany((const char*)&data, sizeof(data));
  2282. break;
  2283. }
  2284. case NUdf::TDataType<NUdf::TDatetime>::Id:
  2285. case NUdf::TDataType<ui32>::Id: {
  2286. ui64 data = value.Get<ui32>();
  2287. buf.WriteMany((const char*)&data, sizeof(data));
  2288. break;
  2289. }
  2290. case NUdf::TDataType<NUdf::TInterval>::Id:
  2291. case NUdf::TDataType<NUdf::TInterval64>::Id:
  2292. case NUdf::TDataType<NUdf::TDatetime64>::Id:
  2293. case NUdf::TDataType<NUdf::TTimestamp64>::Id:
  2294. case NUdf::TDataType<i64>::Id: {
  2295. i64 data = value.Get<i64>();
  2296. buf.WriteMany((const char*)&data, sizeof(data));
  2297. break;
  2298. }
  2299. case NUdf::TDataType<NUdf::TTimestamp>::Id:
  2300. case NUdf::TDataType<ui64>::Id: {
  2301. ui64 data = value.Get<ui64>();
  2302. buf.WriteMany((const char*)&data, sizeof(data));
  2303. break;
  2304. }
  2305. case NUdf::TDataType<float>::Id: {
  2306. double data = value.Get<float>();
  2307. buf.WriteMany((const char*)&data, sizeof(data));
  2308. break;
  2309. }
  2310. case NUdf::TDataType<double>::Id: {
  2311. double data = value.Get<double>();
  2312. buf.WriteMany((const char*)&data, sizeof(data));
  2313. break;
  2314. }
  2315. case NUdf::TDataType<NUdf::TUtf8>::Id:
  2316. case NUdf::TDataType<char*>::Id:
  2317. case NUdf::TDataType<NUdf::TJson>::Id:
  2318. case NUdf::TDataType<NUdf::TYson>::Id:
  2319. case NUdf::TDataType<NUdf::TDyNumber>::Id:
  2320. case NUdf::TDataType<NUdf::TUuid>::Id: {
  2321. auto str = value.AsStringRef();
  2322. ui32 size = str.Size();
  2323. buf.WriteMany((const char*)&size, sizeof(size));
  2324. buf.WriteMany(str);
  2325. break;
  2326. }
  2327. case NUdf::TDataType<NUdf::TDecimal>::Id: {
  2328. if (nativeYtTypeFlags & NTCF_DECIMAL) {
  2329. auto const params = static_cast<TDataDecimalType*>(type)->GetParams();
  2330. const NDecimal::TInt128 data128 = value.GetInt128();
  2331. if (params.first < 10) {
  2332. auto data = NDecimal::ToYtDecimal<i32>(data128);
  2333. buf.WriteMany((const char*)&data, sizeof(data));
  2334. } else if (params.first < 19) {
  2335. auto data = NDecimal::ToYtDecimal<i64>(data128);
  2336. buf.WriteMany((const char*)&data, sizeof(data));
  2337. } else {
  2338. YQL_ENSURE(params.first < 36);
  2339. auto data = NDecimal::ToYtDecimal<NDecimal::TInt128>(data128);
  2340. buf.WriteMany((const char*)&data, sizeof(data));
  2341. }
  2342. } else {
  2343. char data[sizeof(NDecimal::TInt128)];
  2344. const ui32 size = NDecimal::Serialize(value.GetInt128(), data);
  2345. buf.WriteMany(reinterpret_cast<const char*>(&size), sizeof(size));
  2346. buf.WriteMany(data, size);
  2347. }
  2348. break;
  2349. }
  2350. case NUdf::TDataType<NUdf::TTzDate>::Id: {
  2351. ui16 tzId = SwapBytes(value.GetTimezoneId());
  2352. ui16 data = SwapBytes(value.Get<ui16>());
  2353. ui32 size = sizeof(data) + sizeof(tzId);
  2354. buf.WriteMany((const char*)&size, sizeof(size));
  2355. buf.WriteMany((const char*)&data, sizeof(data));
  2356. buf.WriteMany((const char*)&tzId, sizeof(tzId));
  2357. break;
  2358. }
  2359. case NUdf::TDataType<NUdf::TTzDatetime>::Id: {
  2360. ui16 tzId = SwapBytes(value.GetTimezoneId());
  2361. ui32 data = SwapBytes(value.Get<ui32>());
  2362. ui32 size = sizeof(data) + sizeof(tzId);
  2363. buf.WriteMany((const char*)&size, sizeof(size));
  2364. buf.WriteMany((const char*)&data, sizeof(data));
  2365. buf.WriteMany((const char*)&tzId, sizeof(tzId));
  2366. break;
  2367. }
  2368. case NUdf::TDataType<NUdf::TTzTimestamp>::Id: {
  2369. ui16 tzId = SwapBytes(value.GetTimezoneId());
  2370. ui64 data = SwapBytes(value.Get<ui64>());
  2371. ui32 size = sizeof(data) + sizeof(tzId);
  2372. buf.WriteMany((const char*)&size, sizeof(size));
  2373. buf.WriteMany((const char*)&data, sizeof(data));
  2374. buf.WriteMany((const char*)&tzId, sizeof(tzId));
  2375. break;
  2376. }
  2377. case NUdf::TDataType<NUdf::TTzDate32>::Id: {
  2378. ui16 tzId = SwapBytes(value.GetTimezoneId());
  2379. ui32 data = 0x80 ^ SwapBytes((ui32)value.Get<i32>());
  2380. ui32 size = sizeof(data) + sizeof(tzId);
  2381. buf.WriteMany((const char*)&size, sizeof(size));
  2382. buf.WriteMany((const char*)&data, sizeof(data));
  2383. buf.WriteMany((const char*)&tzId, sizeof(tzId));
  2384. break;
  2385. }
  2386. case NUdf::TDataType<NUdf::TTzDatetime64>::Id: {
  2387. ui16 tzId = SwapBytes(value.GetTimezoneId());
  2388. ui64 data = 0x80 ^ SwapBytes((ui64)value.Get<i64>());
  2389. ui32 size = sizeof(data) + sizeof(tzId);
  2390. buf.WriteMany((const char*)&size, sizeof(size));
  2391. buf.WriteMany((const char*)&data, sizeof(data));
  2392. buf.WriteMany((const char*)&tzId, sizeof(tzId));
  2393. break;
  2394. }
  2395. case NUdf::TDataType<NUdf::TTzTimestamp64>::Id: {
  2396. ui16 tzId = SwapBytes(value.GetTimezoneId());
  2397. ui64 data = 0x80 ^ SwapBytes((ui64)value.Get<i64>());
  2398. ui32 size = sizeof(data) + sizeof(tzId);
  2399. buf.WriteMany((const char*)&size, sizeof(size));
  2400. buf.WriteMany((const char*)&data, sizeof(data));
  2401. buf.WriteMany((const char*)&tzId, sizeof(tzId));
  2402. break;
  2403. }
  2404. case NUdf::TDataType<NUdf::TJsonDocument>::Id: {
  2405. NUdf::TUnboxedValue json = ValueToString(EDataSlot::JsonDocument, value);
  2406. auto str = json.AsStringRef();
  2407. ui32 size = str.Size();
  2408. buf.WriteMany((const char*)&size, sizeof(size));
  2409. buf.WriteMany(str);
  2410. break;
  2411. }
  2412. default:
  2413. YQL_ENSURE(false, "Unsupported data type: " << schemeType);
  2414. }
  2415. }
  2416. void WriteSkiffNativeYtValue(NKikimr::NMiniKQL::TType* type, ui64 nativeYtTypeFlags, const NKikimr::NUdf::TUnboxedValuePod& value, NCommon::TOutputBuf& buf) {
  2417. if (type->IsData()) {
  2418. WriteSkiffData(type, nativeYtTypeFlags, value, buf);
  2419. } else if (type->IsPg()) {
  2420. WriteSkiffPgValue(static_cast<TPgType*>(type), value, buf);
  2421. } else if (type->IsOptional()) {
  2422. if (!value) {
  2423. buf.Write('\0');
  2424. return;
  2425. }
  2426. buf.Write('\1');
  2427. WriteSkiffNativeYtValue(AS_TYPE(TOptionalType, type)->GetItemType(), nativeYtTypeFlags, value.GetOptionalValue(), buf);
  2428. } else if (type->IsList()) {
  2429. auto itemType = AS_TYPE(TListType, type)->GetItemType();
  2430. auto elements = value.GetElements();
  2431. if (elements) {
  2432. ui32 size = value.GetListLength();
  2433. for (ui32 i = 0; i < size; ++i) {
  2434. buf.Write('\0');
  2435. WriteSkiffNativeYtValue(itemType, nativeYtTypeFlags, elements[i], buf);
  2436. }
  2437. } else {
  2438. NUdf::TUnboxedValue item;
  2439. for (auto iter = value.GetListIterator(); iter.Next(item); ) {
  2440. buf.Write('\0');
  2441. WriteSkiffNativeYtValue(itemType, nativeYtTypeFlags, item, buf);
  2442. }
  2443. }
  2444. buf.Write('\xff');
  2445. } else if (type->IsTuple()) {
  2446. auto tupleType = AS_TYPE(TTupleType, type);
  2447. auto elements = value.GetElements();
  2448. if (elements) {
  2449. for (ui32 i = 0; i < tupleType->GetElementsCount(); ++i) {
  2450. WriteSkiffNativeYtValue(tupleType->GetElementType(i), nativeYtTypeFlags, elements[i], buf);
  2451. }
  2452. } else {
  2453. for (ui32 i = 0; i < tupleType->GetElementsCount(); ++i) {
  2454. WriteSkiffNativeYtValue(tupleType->GetElementType(i), nativeYtTypeFlags, value.GetElement(i), buf);
  2455. }
  2456. }
  2457. } else if (type->IsStruct()) {
  2458. auto structType = AS_TYPE(TStructType, type);
  2459. auto elements = value.GetElements();
  2460. if (auto cookie = type->GetCookie()) {
  2461. const std::vector<size_t>& reorder = *((const std::vector<size_t>*)cookie);
  2462. if (elements) {
  2463. for (ui32 i = 0; i < structType->GetMembersCount(); ++i) {
  2464. const auto ndx = reorder[i];
  2465. WriteSkiffNativeYtValue(structType->GetMemberType(ndx), nativeYtTypeFlags, elements[ndx], buf);
  2466. }
  2467. } else {
  2468. for (ui32 i = 0; i < structType->GetMembersCount(); ++i) {
  2469. const auto ndx = reorder[i];
  2470. WriteSkiffNativeYtValue(structType->GetMemberType(ndx), nativeYtTypeFlags, value.GetElement(ndx), buf);
  2471. }
  2472. }
  2473. } else {
  2474. if (elements) {
  2475. for (ui32 i = 0; i < structType->GetMembersCount(); ++i) {
  2476. WriteSkiffNativeYtValue(structType->GetMemberType(i), nativeYtTypeFlags, elements[i], buf);
  2477. }
  2478. } else {
  2479. for (ui32 i = 0; i < structType->GetMembersCount(); ++i) {
  2480. WriteSkiffNativeYtValue(structType->GetMemberType(i), nativeYtTypeFlags, value.GetElement(i), buf);
  2481. }
  2482. }
  2483. }
  2484. } else if (type->IsVariant()) {
  2485. auto varType = AS_TYPE(TVariantType, type);
  2486. ui16 index = (ui16)value.GetVariantIndex();
  2487. if (varType->GetAlternativesCount() < 256) {
  2488. buf.WriteMany((const char*)&index, 1);
  2489. } else {
  2490. buf.WriteMany((const char*)&index, sizeof(index));
  2491. }
  2492. if (varType->GetUnderlyingType()->IsTuple()) {
  2493. auto tupleType = AS_TYPE(TTupleType, varType->GetUnderlyingType());
  2494. WriteSkiffNativeYtValue(tupleType->GetElementType(index), nativeYtTypeFlags, value.GetVariantItem(), buf);
  2495. } else {
  2496. auto structType = AS_TYPE(TStructType, varType->GetUnderlyingType());
  2497. if (auto cookie = structType->GetCookie()) {
  2498. const std::vector<size_t>& reorder = *((const std::vector<size_t>*)cookie);
  2499. index = reorder[index];
  2500. }
  2501. YQL_ENSURE(index < structType->GetMembersCount());
  2502. WriteSkiffNativeYtValue(structType->GetMemberType(index), nativeYtTypeFlags, value.GetVariantItem(), buf);
  2503. }
  2504. } else if (type->IsVoid() || type->IsNull() || type->IsEmptyList() || type->IsEmptyDict()) {
  2505. } else if (type->IsDict()) {
  2506. auto dictType = AS_TYPE(TDictType, type);
  2507. auto keyType = dictType->GetKeyType();
  2508. auto payloadType = dictType->GetPayloadType();
  2509. NUdf::TUnboxedValue key, payload;
  2510. for (auto iter = value.GetDictIterator(); iter.NextPair(key, payload); ) {
  2511. buf.Write('\0');
  2512. WriteSkiffNativeYtValue(keyType, nativeYtTypeFlags, key, buf);
  2513. WriteSkiffNativeYtValue(payloadType, nativeYtTypeFlags, payload, buf);
  2514. }
  2515. buf.Write('\xff');
  2516. } else {
  2517. YQL_ENSURE(false, "Unsupported type: " << type->GetKindAsStr());
  2518. }
  2519. }
  2520. TExprNode::TPtr ValueToExprLiteral(const TTypeAnnotationNode* type, const NKikimr::NUdf::TUnboxedValuePod& value, TExprContext& ctx,
  2521. TPositionHandle pos) {
  2522. switch (type->GetKind()) {
  2523. case ETypeAnnotationKind::Variant: {
  2524. auto variantType = type->Cast<TVariantExprType>();
  2525. ui32 index = value.GetVariantIndex();
  2526. const TTypeAnnotationNode* itemType;
  2527. if (variantType->GetUnderlyingType()->GetKind() == ETypeAnnotationKind::Struct) {
  2528. // struct
  2529. const auto& items = variantType->GetUnderlyingType()->Cast<TStructExprType>()->GetItems();
  2530. YQL_ENSURE(index < items.size());
  2531. itemType = items[index]->GetItemType();
  2532. } else if (variantType->GetUnderlyingType()->GetKind() == ETypeAnnotationKind::Tuple) {
  2533. // tuple
  2534. const auto& items = variantType->GetUnderlyingType()->Cast<TTupleExprType>()->GetItems();
  2535. YQL_ENSURE(index < items.size());
  2536. itemType = items[index];
  2537. } else {
  2538. YQL_ENSURE(false, "Unknown underlying type");
  2539. }
  2540. return ctx.NewCallable(pos, "Variant", {
  2541. ValueToExprLiteral(itemType, value.GetVariantItem(), ctx, pos),
  2542. ctx.NewAtom(pos, variantType->GetUnderlyingType()->GetKind() == ETypeAnnotationKind::Struct ?
  2543. variantType->GetUnderlyingType()->Cast<TStructExprType>()->GetItems()[index]->GetName() : ToString(index)),
  2544. ExpandType(pos, *type, ctx)
  2545. });
  2546. }
  2547. case ETypeAnnotationKind::Data: {
  2548. auto dataType = type->Cast<TDataExprType>();
  2549. TVector<TExprNode::TPtr> args({ ctx.NewAtom(pos, DataValueToString(value, dataType)) });
  2550. if (auto params = dynamic_cast<const TDataExprParamsType*>(dataType)) {
  2551. args.reserve(3);
  2552. args.push_back(ctx.NewAtom(pos, params->GetParamOne()));
  2553. args.push_back(ctx.NewAtom(pos, params->GetParamTwo()));
  2554. }
  2555. return ctx.NewCallable(pos, dataType->GetName(), std::move(args));
  2556. }
  2557. case ETypeAnnotationKind::Struct: {
  2558. auto structType = type->Cast<TStructExprType>();
  2559. TExprNode::TListType items;
  2560. items.reserve(1 + structType->GetSize());
  2561. items.emplace_back(ExpandType(pos, *type, ctx));
  2562. for (ui32 i = 0; i < structType->GetSize(); ++i) {
  2563. auto pair = ctx.NewList(pos, {
  2564. ctx.NewAtom(pos, structType->GetItems()[i]->GetName()),
  2565. ValueToExprLiteral(structType->GetItems()[i]->GetItemType(), value.GetElement(i), ctx, pos)
  2566. });
  2567. items.emplace_back(std::move(pair));
  2568. }
  2569. return ctx.NewCallable(pos, "Struct", std::move(items));
  2570. }
  2571. case ETypeAnnotationKind::List: {
  2572. auto listType = type->Cast<TListExprType>();
  2573. auto itemType = listType->GetItemType();
  2574. TExprNode::TListType items;
  2575. items.emplace_back(ExpandType(pos, *type, ctx));
  2576. NUdf::TUnboxedValue itemValue;
  2577. for (auto iter = value.GetListIterator(); iter.Next(itemValue);) {
  2578. items.emplace_back(ValueToExprLiteral(itemType, itemValue, ctx, pos));
  2579. }
  2580. if (items.size() > 1) {
  2581. items.erase(items.begin());
  2582. return ctx.NewCallable(pos, "AsList", std::move(items));
  2583. }
  2584. return ctx.NewCallable(pos, "List", std::move(items));
  2585. }
  2586. case ETypeAnnotationKind::Optional: {
  2587. auto optionalType = type->Cast<TOptionalExprType>();
  2588. auto itemType = optionalType->GetItemType();
  2589. if (!value) {
  2590. return ctx.NewCallable(pos, "Nothing", { ExpandType(pos, *type, ctx) });
  2591. } else {
  2592. return ctx.NewCallable(pos, "Just", { ValueToExprLiteral(itemType, value.GetOptionalValue(), ctx, pos)});
  2593. }
  2594. }
  2595. case ETypeAnnotationKind::Dict: {
  2596. auto dictType = type->Cast<TDictExprType>();
  2597. auto keyType = dictType->GetKeyType();
  2598. auto payloadType = dictType->GetPayloadType();
  2599. TExprNode::TListType items;
  2600. items.emplace_back(ExpandType(pos, *type, ctx));
  2601. NUdf::TUnboxedValue keyValue, payloadValue;
  2602. for (auto iter = value.GetDictIterator(); iter.NextPair(keyValue, payloadValue);) {
  2603. auto pair = ctx.NewList(pos, {
  2604. ValueToExprLiteral(keyType, keyValue, ctx, pos),
  2605. ValueToExprLiteral(payloadType, payloadValue, ctx, pos)
  2606. });
  2607. items.emplace_back(std::move(pair));
  2608. }
  2609. return ctx.NewCallable(pos, "Dict", std::move(items));
  2610. }
  2611. case ETypeAnnotationKind::Tuple: {
  2612. auto tupleType = type->Cast<TTupleExprType>();
  2613. TExprNode::TListType items;
  2614. items.reserve(tupleType->GetSize());
  2615. for (ui32 i = 0; i < tupleType->GetSize(); ++i) {
  2616. items.emplace_back(ValueToExprLiteral(tupleType->GetItems()[i], value.GetElement(i), ctx, pos));
  2617. }
  2618. return ctx.NewList(pos, std::move(items));
  2619. }
  2620. case ETypeAnnotationKind::Void: {
  2621. return ctx.NewCallable(pos, "Void", {});
  2622. }
  2623. case ETypeAnnotationKind::Null: {
  2624. return ctx.NewCallable(pos, "Null", {});
  2625. }
  2626. case ETypeAnnotationKind::EmptyList: {
  2627. return ctx.NewCallable(pos, "AsList", {});
  2628. }
  2629. case ETypeAnnotationKind::EmptyDict: {
  2630. return ctx.NewCallable(pos, "AsDict", {});
  2631. }
  2632. case ETypeAnnotationKind::Tagged: {
  2633. auto taggedType = type->Cast<TTaggedExprType>();
  2634. auto baseType = taggedType->GetBaseType();
  2635. return ctx.NewCallable(pos, "AsTagged", {
  2636. ValueToExprLiteral(baseType, value, ctx, pos),
  2637. ctx.NewAtom(pos, taggedType->GetTag()),
  2638. });
  2639. }
  2640. case ETypeAnnotationKind::Pg: {
  2641. auto pgType = type->Cast<TPgExprType>();
  2642. if (!value) {
  2643. return ctx.NewCallable(pos, "Nothing", {
  2644. ctx.NewCallable(pos, "PgType", {
  2645. ctx.NewAtom(pos, pgType->GetName())
  2646. })
  2647. });
  2648. } else {
  2649. return ctx.NewCallable(pos, "PgConst", {
  2650. ctx.NewAtom(pos, PgValueToString(value, pgType->GetId())),
  2651. ctx.NewCallable(pos, "PgType", {
  2652. ctx.NewAtom(pos, pgType->GetName())
  2653. })
  2654. });
  2655. }
  2656. }
  2657. default:
  2658. break;
  2659. }
  2660. YQL_ENSURE(false, "Unsupported type: " << type->GetKind());
  2661. }
  2662. } // namespace NCommon
  2663. } // namespace NYql