sql_format_ut.h 74 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812
  1. Y_UNIT_TEST(Pragma) {
  2. TCases cases = {
  3. {"pragma user = user;","PRAGMA user = user;\n"},
  4. {"pragma user = default;","PRAGMA user = default;\n"},
  5. {"pragma user.user = user;","PRAGMA user.user = user;\n"},
  6. {"pragma user.user(user);","PRAGMA user.user(user);\n"},
  7. {"pragma user.user(user, user);","PRAGMA user.user(user, user);\n"},
  8. };
  9. TSetup setup;
  10. setup.Run(cases);
  11. }
  12. Y_UNIT_TEST(DotAfterDigits) {
  13. TCases cases = {
  14. {"select a.1 .b from plato.foo;","SELECT\n\ta.1 .b\nFROM\n\tplato.foo\n;\n"},
  15. };
  16. TSetup setup;
  17. setup.Run(cases);
  18. }
  19. Y_UNIT_TEST(GrantPermissions) {
  20. TCases cases {
  21. {"use plato;grant connect, modify tables, list on `/Root` to user;", "USE plato;\n\nGRANT CONNECT, MODIFY TABLES, LIST ON `/Root` TO user;\n"},
  22. {"use plato;grant select , select tables, select attributes on `/Root` to user;", "USE plato;\n\nGRANT SELECT, SELECT TABLES, SELECT ATTRIBUTES ON `/Root` TO user;\n"},
  23. {"use plato;grant insert, modify attributes on `/Root` to user;", "USE plato;\n\nGRANT INSERT, MODIFY ATTRIBUTES ON `/Root` TO user;\n"},
  24. {"use plato;grant use legacy, use on `/Root` to user1, user2;", "USE plato;\n\nGRANT USE LEGACY, USE ON `/Root` TO user1, user2;\n"},
  25. {"use plato;grant manage, full legacy, full, create on `/Root` to user;", "USE plato;\n\nGRANT MANAGE, FULL LEGACY, FULL, CREATE ON `/Root` TO user;\n"},
  26. {"use plato;grant drop, grant, select row, update row on `/Root` to user;", "USE plato;\n\nGRANT DROP, GRANT, SELECT ROW, UPDATE ROW ON `/Root` TO user;\n"},
  27. {"use plato;grant erase row, create directory on `/Root` to user;", "USE plato;\n\nGRANT ERASE ROW, CREATE DIRECTORY ON `/Root` TO user;\n"},
  28. {"use plato;grant create table, create queue, remove schema on `/Root` to user;", "USE plato;\n\nGRANT CREATE TABLE, CREATE QUEUE, REMOVE SCHEMA ON `/Root` TO user;\n"},
  29. {"use plato;grant describe schema, alter schema on `/Root` to user;", "USE plato;\n\nGRANT DESCRIBE SCHEMA, ALTER SCHEMA ON `/Root` TO user;\n"},
  30. {"use plato;grant select, on `/Root` to user, with grant option;", "USE plato;\n\nGRANT SELECT, ON `/Root` TO user, WITH GRANT OPTION;\n"},
  31. {"use plato;grant all privileges on `/Root` to user;", "USE plato;\n\nGRANT ALL PRIVILEGES ON `/Root` TO user;\n"},
  32. {"use plato;grant list on `/Root/db1`, `/Root/db2` to user;", "USE plato;\n\nGRANT LIST ON `/Root/db1`, `/Root/db2` TO user;\n"}
  33. };
  34. TSetup setup;
  35. setup.Run(cases);
  36. }
  37. Y_UNIT_TEST(RevokePermissions) {
  38. TCases cases {
  39. {"use plato;revoke connect, modify tables, list on `/Root` from user;", "USE plato;\n\nREVOKE CONNECT, MODIFY TABLES, LIST ON `/Root` FROM user;\n"},
  40. {"use plato;revoke select , select tables, select attributes on `/Root` from user;", "USE plato;\n\nREVOKE SELECT, SELECT TABLES, SELECT ATTRIBUTES ON `/Root` FROM user;\n"},
  41. {"use plato;revoke insert, modify attributes on `/Root` from user;", "USE plato;\n\nREVOKE INSERT, MODIFY ATTRIBUTES ON `/Root` FROM user;\n"},
  42. {"use plato;revoke use legacy, use on `/Root` from user1, user2;", "USE plato;\n\nREVOKE USE LEGACY, USE ON `/Root` FROM user1, user2;\n"},
  43. {"use plato;revoke manage, full legacy, full, create on `/Root` from user;", "USE plato;\n\nREVOKE MANAGE, FULL LEGACY, FULL, CREATE ON `/Root` FROM user;\n"},
  44. {"use plato;revoke drop, grant, select row, update row on `/Root` from user;", "USE plato;\n\nREVOKE DROP, GRANT, SELECT ROW, UPDATE ROW ON `/Root` FROM user;\n"},
  45. {"use plato;revoke erase row, create directory on `/Root` from user;", "USE plato;\n\nREVOKE ERASE ROW, CREATE DIRECTORY ON `/Root` FROM user;\n"},
  46. {"use plato;revoke create table, create queue, remove schema on `/Root` from user;", "USE plato;\n\nREVOKE CREATE TABLE, CREATE QUEUE, REMOVE SCHEMA ON `/Root` FROM user;\n"},
  47. {"use plato;revoke describe schema, alter schema on `/Root` from user;", "USE plato;\n\nREVOKE DESCRIBE SCHEMA, ALTER SCHEMA ON `/Root` FROM user;\n"},
  48. {"use plato;revoke grant option for insert, on `/Root` from user;", "USE plato;\n\nREVOKE GRANT OPTION FOR INSERT, ON `/Root` FROM user;\n"},
  49. {"use plato;revoke all privileges on `/Root` from user;", "USE plato;\n\nREVOKE ALL PRIVILEGES ON `/Root` FROM user;\n"},
  50. {"use plato;revoke list on `/Root/db1`, `/Root/db2` from user;", "USE plato;\n\nREVOKE LIST ON `/Root/db1`, `/Root/db2` FROM user;\n"}
  51. };
  52. TSetup setup;
  53. setup.Run(cases);
  54. }
  55. Y_UNIT_TEST(DropRole) {
  56. TCases cases = {
  57. {"use plato;drop user user,user,user;","USE plato;\n\nDROP USER user, user, user;\n"},
  58. {"use plato;drop group if exists user;","USE plato;\n\nDROP GROUP IF EXISTS user;\n"},
  59. {"use plato;drop group user,;","USE plato;\n\nDROP GROUP user,;\n"},
  60. };
  61. TSetup setup;
  62. setup.Run(cases);
  63. }
  64. Y_UNIT_TEST(CreateUser) {
  65. TCases cases = {
  66. {"use plato;create user user;", "USE plato;\n\nCREATE USER user;\n"},
  67. {"use plato;create user user encrypted password 'foo';", "USE plato;\n\nCREATE USER user ENCRYPTED PASSWORD 'foo';\n"},
  68. {"use plato;CREATE USER user1;", "USE plato;\n\nCREATE USER user1;\n"},
  69. {"use plato;create user user1 encrypted password '123' login;", "USE plato;\n\nCREATE USER user1 ENCRYPTED PASSWORD '123' LOGIN;\n"},
  70. {"use plato;cREATE USER user1 PASSWORD '123' NOLOGIN;", "USE plato;\n\nCREATE USER user1 PASSWORD '123' NOLOGIN;\n"},
  71. {"use plato;CREATE USER user1 LOGIN;", "USE plato;\n\nCREATE USER user1 LOGIN;\n"},
  72. {"use plato;CREATE USER user1 NOLOGIN;", "USE plato;\n\nCREATE USER user1 NOLOGIN;\n"},
  73. {"use plato;CReATE UseR user1 HasH '{\"hash\": \"p4ffeMugohqyBwyckYCK1TjJfz3LIHbKiGL+t+oEhzw=\",\"salt\": \"U+tzBtgo06EBQCjlARA6Jg==\",\"type\": \"argon2id\"}'",
  74. "USE plato;\n\nCREATE USER user1 HASH '{\"hash\": \"p4ffeMugohqyBwyckYCK1TjJfz3LIHbKiGL+t+oEhzw=\",\"salt\": \"U+tzBtgo06EBQCjlARA6Jg==\",\"type\": \"argon2id\"}';\n"},
  75. };
  76. TSetup setup;
  77. setup.Run(cases);
  78. }
  79. Y_UNIT_TEST(CreateGroup) {
  80. TCases cases = {
  81. {"use plato;create group user;","USE plato;\n\nCREATE GROUP user;\n"},
  82. {"use plato;create group user with user user;","USE plato;\n\nCREATE GROUP user WITH USER user;\n"},
  83. {"use plato;create group user with user user, user,;","USE plato;\n\nCREATE GROUP user WITH USER user, user,;\n"},
  84. };
  85. TSetup setup;
  86. setup.Run(cases);
  87. }
  88. Y_UNIT_TEST(AlterUser) {
  89. TCases cases = {
  90. {"use plato;alter user user rename to user;","USE plato;\n\nALTER USER user RENAME TO user;\n"},
  91. {"use plato;alter user user encrypted password 'foo';","USE plato;\n\nALTER USER user ENCRYPTED PASSWORD 'foo';\n"},
  92. {"use plato;alter user user with encrypted password 'foo';","USE plato;\n\nALTER USER user WITH ENCRYPTED PASSWORD 'foo';\n"},
  93. {"use plato;ALTER USER user1 NOLOGIN;", "USE plato;\n\nALTER USER user1 NOLOGIN;\n"},
  94. {"use plato;alter UseR user1 HasH '{\"hash\": \"p4ffeMugohqyBwyckYCK1TjJfz3LIHbKiGL+t+oEhzw=\",\"salt\": \"U+tzBtgo06EBQCjlARA6Jg==\",\"type\": \"argon2id\"}'",
  95. "USE plato;\n\nALTER USER user1 HASH '{\"hash\": \"p4ffeMugohqyBwyckYCK1TjJfz3LIHbKiGL+t+oEhzw=\",\"salt\": \"U+tzBtgo06EBQCjlARA6Jg==\",\"type\": \"argon2id\"}';\n"},
  96. };
  97. TSetup setup;
  98. setup.Run(cases);
  99. }
  100. Y_UNIT_TEST(AlterGroup) {
  101. TCases cases = {
  102. {"use plato;alter group user add user user;","USE plato;\n\nALTER GROUP user ADD USER user;\n"},
  103. {"use plato;alter group user drop user user;","USE plato;\n\nALTER GROUP user DROP USER user;\n"},
  104. {"use plato;alter group user add user user, user,;","USE plato;\n\nALTER GROUP user ADD USER user, user,;\n"},
  105. {"use plato;alter group user rename to user;","USE plato;\n\nALTER GROUP user RENAME TO user;\n"},
  106. };
  107. TSetup setup;
  108. setup.Run(cases);
  109. }
  110. Y_UNIT_TEST(AlterSequence) {
  111. TCases cases = {
  112. {"use plato;alter sequence sequence start with 10 increment 2 restart with 5;","USE plato;\n\nALTER SEQUENCE sequence START WITH 10 INCREMENT 2 RESTART WITH 5;\n"},
  113. {"use plato;alter sequence if exists sequence increment 1000 start 100 restart;","USE plato;\n\nALTER SEQUENCE IF EXISTS sequence INCREMENT 1000 START 100 RESTART;\n"},
  114. };
  115. TSetup setup;
  116. setup.Run(cases);
  117. }
  118. Y_UNIT_TEST(Use) {
  119. TCases cases = {
  120. {"use user;","USE user;\n"},
  121. {"use user:user;","USE user: user;\n"},
  122. {"use user:*;","USE user: *;\n"},
  123. };
  124. TSetup setup;
  125. setup.Run(cases);
  126. }
  127. Y_UNIT_TEST(Commit) {
  128. TCases cases = {
  129. {"commit;","COMMIT;\n"},
  130. };
  131. TSetup setup;
  132. setup.Run(cases);
  133. }
  134. Y_UNIT_TEST(Rollback) {
  135. TCases cases = {
  136. {"rollback;","ROLLBACK;\n"},
  137. };
  138. TSetup setup;
  139. setup.Run(cases);
  140. }
  141. Y_UNIT_TEST(Export) {
  142. TCases cases = {
  143. {"export $foo;","EXPORT\n\t$foo\n;\n"},
  144. {"export $foo, $bar;","EXPORT\n\t$foo,\n\t$bar\n;\n"},
  145. };
  146. TSetup setup;
  147. setup.Run(cases);
  148. }
  149. Y_UNIT_TEST(Import) {
  150. TCases cases = {
  151. {"import user symbols $foo;","IMPORT user SYMBOLS $foo;\n"},
  152. {"import user symbols $foo,$bar;","IMPORT user SYMBOLS $foo, $bar;\n"},
  153. };
  154. TSetup setup;
  155. setup.Run(cases);
  156. }
  157. Y_UNIT_TEST(Values) {
  158. TCases cases = {
  159. {"values (1);","VALUES\n\t(1)\n;\n"},
  160. {"values (1,2),(3,4);","VALUES\n\t(1, 2),\n\t(3, 4)\n;\n"},
  161. {"values ('a\nb');","VALUES\n\t('a\nb')\n;\n"},
  162. };
  163. TSetup setup;
  164. setup.Run(cases);
  165. }
  166. Y_UNIT_TEST(Declare) {
  167. TCases cases = {
  168. {"declare $foo as int32;","DECLARE $foo AS int32;\n"},
  169. {"declare $foo as bool ?","DECLARE $foo AS bool?;\n"},
  170. {"declare $foo as bool ? ?","DECLARE $foo AS bool??;\n"},
  171. };
  172. TSetup setup;
  173. setup.Run(cases);
  174. }
  175. Y_UNIT_TEST(NamedNode) {
  176. TCases cases = {
  177. {"$x=1",
  178. "$x = 1;\n"},
  179. {"$x,$y=(2,3)",
  180. "$x, $y = (2, 3);\n"},
  181. {"$a = select 1 union all select 2",
  182. "$a = (\n\tSELECT\n\t\t1\n\tUNION ALL\n\tSELECT\n\t\t2\n);\n"},
  183. {"$a = select 1 from $as;",
  184. "$a = (\n\tSELECT\n\t\t1\n\tFROM\n\t\t$as\n);\n"},
  185. {"$a = select * from $t -- comment",
  186. "$a = (\n\tSELECT\n\t\t*\n\tFROM\n\t\t$t -- comment\n);\n"},
  187. {"-- comment\r\r\r$a=1;",
  188. "-- comment\r\n$a = 1;\n"},
  189. {"$a=1;-- comment\n$b=2;/* comment */ /* comment */\n$c = 3;/* comment */ -- comment",
  190. "$a = 1; -- comment\n$b = 2; /* comment */ /* comment */\n$c = 3; /* comment */ -- comment\n"},
  191. };
  192. TSetup setup;
  193. setup.Run(cases);
  194. }
  195. Y_UNIT_TEST(DropTable) {
  196. TCases cases = {
  197. {"drop table user","DROP TABLE user;\n"},
  198. {"drop table if exists user","DROP TABLE IF EXISTS user;\n"},
  199. };
  200. TSetup setup;
  201. setup.Run(cases);
  202. }
  203. Y_UNIT_TEST(CreateTable) {
  204. TCases cases = {
  205. {"create table user(user int32)","CREATE TABLE user (\n\tuser int32\n);\n"},
  206. {"create table user(user int32,user bool ?)","CREATE TABLE user (\n\tuser int32,\n\tuser bool?\n);\n"},
  207. {"create table user(user int32) with (user=user)","CREATE TABLE user (\n\tuser int32\n)\nWITH (user = user);\n"},
  208. {"create table user(primary key (user))","CREATE TABLE user (\n\tPRIMARY KEY (user)\n);\n"},
  209. {"create table user(primary key (user,user))","CREATE TABLE user (\n\tPRIMARY KEY (user, user)\n);\n"},
  210. {"create table user(partition by (user))","CREATE TABLE user (\n\tPARTITION BY (user)\n);\n"},
  211. {"create table user(partition by (user,user))","CREATE TABLE user (\n\tPARTITION BY (user, user)\n);\n"},
  212. {"create table user(order by (user asc))","CREATE TABLE user (\n\tORDER BY (user ASC)\n);\n"},
  213. {"create table user(order by (user desc,user))","CREATE TABLE user (\n\tORDER BY (user DESC, user)\n);\n"},
  214. {"create table user(user int32) with (ttl=interval('P1D') on user as seconds)",
  215. "CREATE TABLE user (\n\tuser int32\n)\nWITH (ttl = interval('P1D') ON user AS SECONDS);\n"},
  216. {"create table user(user int32) with (ttl=interval('P1D') on user as MilliSeconds)",
  217. "CREATE TABLE user (\n\tuser int32\n)\nWITH (ttl = interval('P1D') ON user AS MILLISECONDS);\n"},
  218. {"create table user(user int32) with (ttl=interval('P1D') on user as microSeconds)",
  219. "CREATE TABLE user (\n\tuser int32\n)\nWITH (ttl = interval('P1D') ON user AS MICROSECONDS);\n"},
  220. {"create table user(user int32) with (ttl=interval('P1D') on user as nAnOsEcOnDs)",
  221. "CREATE TABLE user (\n\tuser int32\n)\nWITH (ttl = interval('P1D') ON user AS NANOSECONDS);\n"},
  222. {"create table user(user int32) with (ttl=interval('P1D') delete on user as nAnOsEcOnDs)",
  223. "CREATE TABLE user (\n\tuser int32\n)\nWITH (ttl = interval('P1D') DELETE ON user AS NANOSECONDS);\n"},
  224. {"create table user(user int32) with (ttl=interval('P1D')to external data source tier1 ,interval('P10D')delete on user as seconds)",
  225. "CREATE TABLE user (\n"
  226. "\tuser int32\n"
  227. ")\n"
  228. "WITH (ttl =\n"
  229. "\tinterval('P1D') TO EXTERNAL DATA SOURCE tier1,\n"
  230. "\tinterval('P10D') DELETE\n"
  231. "ON user AS SECONDS);\n"},
  232. {"create table user(index user global unique sync on (user,user) with (user=user,user=user))",
  233. "CREATE TABLE user (\n\tINDEX user GLOBAL UNIQUE SYNC ON (user, user) WITH (user = user, user = user)\n);\n"},
  234. {"create table user(index user global async on (user) with (user=user,))",
  235. "CREATE TABLE user (\n\tINDEX user GLOBAL ASYNC ON (user) WITH (user = user,)\n);\n"},
  236. {"create table user(index user local on (user) cover (user))",
  237. "CREATE TABLE user (\n\tINDEX user LOCAL ON (user) COVER (user)\n);\n"},
  238. {"create table user(index user local on (user) cover (user,user))",
  239. "CREATE TABLE user (\n\tINDEX user LOCAL ON (user) COVER (user, user)\n);\n"},
  240. {"create table user(index idx global using subtype on (col) cover (col) with (setting = foo, another_setting = bar));",
  241. "CREATE TABLE user (\n\tINDEX idx GLOBAL USING subtype ON (col) COVER (col) WITH (setting = foo, another_setting = bar)\n);\n"},
  242. {"create table user(family user (user='foo'))",
  243. "CREATE TABLE user (\n\tFAMILY user (user = 'foo')\n);\n"},
  244. {"create table user(family user (user='foo',user='bar'))",
  245. "CREATE TABLE user (\n\tFAMILY user (user = 'foo', user = 'bar')\n);\n"},
  246. {"create table user(changefeed user with (user='foo'))",
  247. "CREATE TABLE user (\n\tCHANGEFEED user WITH (user = 'foo')\n);\n"},
  248. {"create table user(changefeed user with (user='foo',user='bar'))",
  249. "CREATE TABLE user (\n\tCHANGEFEED user WITH (user = 'foo', user = 'bar')\n);\n"},
  250. {"create table user(user) AS SELECT 1","CREATE TABLE user (\n\tuser\n)\nAS\nSELECT\n\t1\n;\n"},
  251. {"create table user(user) AS VALUES (1), (2)","CREATE TABLE user (\n\tuser\n)\nAS\nVALUES\n\t(1),\n\t(2)\n;\n"},
  252. {"create table user(foo int32, bar bool ?) inherits (s3:$cluster.xxx) partition by hash(a,b,hash) with (inherits=interval('PT1D') ON logical_time) tablestore tablestore",
  253. "CREATE TABLE user (\n"
  254. "\tfoo int32,\n"
  255. "\tbar bool?\n"
  256. ")\n"
  257. "INHERITS (s3: $cluster.xxx)\n"
  258. "PARTITION BY HASH (a, b, hash)\n"
  259. "WITH (inherits = interval('PT1D') ON logical_time)\n"
  260. "TABLESTORE tablestore;\n"},
  261. {"create table user(foo int32, bar bool ?) partition by hash(a,b,hash) with (tiering='some')",
  262. "CREATE TABLE user (\n"
  263. "\tfoo int32,\n"
  264. "\tbar bool?\n"
  265. ")\n"
  266. "PARTITION BY HASH (a, b, hash)\n"
  267. "WITH (tiering = 'some');\n"},
  268. {"create table if not exists user(user int32)", "CREATE TABLE IF NOT EXISTS user (\n\tuser int32\n);\n"},
  269. {"create temp table user(user int32)", "CREATE TEMP TABLE user (\n\tuser int32\n);\n"},
  270. {"create temporary table user(user int32)", "CREATE TEMPORARY TABLE user (\n\tuser int32\n);\n"}
  271. };
  272. TSetup setup;
  273. setup.Run(cases);
  274. }
  275. Y_UNIT_TEST(ObjectOperations) {
  276. TCases cases = {
  277. {"alter oBject usEr (TYpe abcde) Set (a = b)",
  278. "ALTER OBJECT usEr (TYPE abcde) SET (a = b);\n"},
  279. {"creAte oBject usEr (tYpe abcde) With (a = b)",
  280. "CREATE OBJECT usEr (TYPE abcde) WITH (a = b);\n"},
  281. {"creAte oBject if not exIstS usEr (tYpe abcde) With (a = b)",
  282. "CREATE OBJECT IF NOT EXISTS usEr (TYPE abcde) WITH (a = b);\n"},
  283. {"creAte oBject usEr (tYpe abcde) With a = b",
  284. "CREATE OBJECT usEr (TYPE abcde) WITH a = b;\n"},
  285. {"dRop oBject usEr (tYpe abcde) With (aeEE)",
  286. "DROP OBJECT usEr (TYPE abcde) WITH (aeEE);\n"},
  287. {"dRop oBject If ExistS usEr (tYpe abcde) With (aeEE)",
  288. "DROP OBJECT IF EXISTS usEr (TYPE abcde) WITH (aeEE);\n"},
  289. {"dRop oBject usEr (tYpe abcde) With aeEE",
  290. "DROP OBJECT usEr (TYPE abcde) WITH aeEE;\n"}
  291. };
  292. TSetup setup;
  293. setup.Run(cases);
  294. }
  295. Y_UNIT_TEST(TableStoreOperations) {
  296. TCases cases = {
  297. {"alter tableStore uSer aDd column usEr int32",
  298. "ALTER TABLESTORE uSer ADD COLUMN usEr int32;\n"},
  299. {"alter tableStore uSer drOp column usEr",
  300. "ALTER TABLESTORE uSer DROP COLUMN usEr;\n"}
  301. };
  302. TSetup setup;
  303. setup.Run(cases);
  304. }
  305. Y_UNIT_TEST(ExternalDataSourceOperations) {
  306. TCases cases = {
  307. {"creAte exTernAl daTa SouRce usEr With (a = \"b\")",
  308. "CREATE EXTERNAL DATA SOURCE usEr WITH (a = 'b');\n"},
  309. {"creAte exTernAl daTa SouRce if not exists usEr With (a = \"b\")",
  310. "CREATE EXTERNAL DATA SOURCE IF NOT EXISTS usEr WITH (a = 'b');\n"},
  311. {"creAte oR rePlaCe exTernAl daTa SouRce usEr With (a = \"b\")",
  312. "CREATE OR REPLACE EXTERNAL DATA SOURCE usEr WITH (a = 'b');\n"},
  313. {"create external data source eds with (a=\"a\",b=\"b\",c = true)",
  314. "CREATE EXTERNAL DATA SOURCE eds WITH (\n\ta = 'a',\n\tb = 'b',\n\tc = TRUE\n);\n"},
  315. {"alter external data source eds set a true, reset (b, c), set (x=y, z=false)",
  316. "ALTER EXTERNAL DATA SOURCE eds\n\tSET a TRUE,\n\tRESET (b, c),\n\tSET (x = y, z = FALSE)\n;\n"},
  317. {"alter external data source eds reset (a), set (x=y)",
  318. "ALTER EXTERNAL DATA SOURCE eds\n\tRESET (a),\n\tSET (x = y)\n;\n"},
  319. {"dRop exTerNal Data SouRce usEr",
  320. "DROP EXTERNAL DATA SOURCE usEr;\n"},
  321. {"dRop exTerNal Data SouRce if exists usEr",
  322. "DROP EXTERNAL DATA SOURCE IF EXISTS usEr;\n"},
  323. };
  324. TSetup setup;
  325. setup.Run(cases);
  326. }
  327. Y_UNIT_TEST(AsyncReplication) {
  328. TCases cases = {
  329. {"create async replication user for table1 AS table2 with (user='foo')",
  330. "CREATE ASYNC REPLICATION user FOR table1 AS table2 WITH (user = 'foo');\n"},
  331. {"alter async replication user set (user='foo')",
  332. "ALTER ASYNC REPLICATION user SET (user = 'foo');\n"},
  333. {"drop async replication user",
  334. "DROP ASYNC REPLICATION user;\n"},
  335. {"drop async replication user cascade",
  336. "DROP ASYNC REPLICATION user CASCADE;\n"},
  337. };
  338. TSetup setup;
  339. setup.Run(cases);
  340. }
  341. Y_UNIT_TEST(Transfer) {
  342. TCases cases = {
  343. {"create transfer user from topic1 to table1 with (user='foo')",
  344. "CREATE TRANSFER user FROM topic1 TO table1 WITH (user = 'foo');\n"},
  345. {"alter transfer user set (user='foo')",
  346. "ALTER TRANSFER user SET (user = 'foo');\n"},
  347. {"drop transfer user",
  348. "DROP TRANSFER user;\n"},
  349. {"drop transfer user cascade",
  350. "DROP TRANSFER user CASCADE;\n"},
  351. {"create transfer user from topic1 to table1 using ($x) -> { $y = cast($x as String); return $y ; } with (user='foo')",
  352. "CREATE TRANSFER user FROM topic1 TO table1 USING ($x) -> {\n $y = CAST($x AS String);\n RETURN $y;\n} WITH (user = 'foo');\n"},
  353. {"create transfer user from topic1 to table1 using $xxx with (user='foo')",
  354. "CREATE TRANSFER user FROM topic1 TO table1 USING $xxx WITH (user = 'foo');\n"},
  355. };
  356. TSetup setup;
  357. setup.Run(cases);
  358. }
  359. Y_UNIT_TEST(ExternalTableOperations) {
  360. TCases cases = {
  361. {"creAte exTernAl TabLe usEr (a int) With (a = \"b\")",
  362. "CREATE EXTERNAL TABLE usEr (\n\ta int\n)\nWITH (a = 'b');\n"},
  363. {"creAte oR rePlaCe exTernAl TabLe usEr (a int) With (a = \"b\")",
  364. "CREATE OR REPLACE EXTERNAL TABLE usEr (\n\ta int\n)\nWITH (a = 'b');\n"},
  365. {"creAte exTernAl TabLe iF NOt Exists usEr (a int) With (a = \"b\")",
  366. "CREATE EXTERNAL TABLE IF NOT EXISTS usEr (\n\ta int\n)\nWITH (a = 'b');\n"},
  367. {"create external table user (a int) with (a=\"b\",c=\"d\")",
  368. "CREATE EXTERNAL TABLE user (\n\ta int\n)\nWITH (\n\ta = 'b',\n\tc = 'd'\n);\n"},
  369. {"alter external table user add column col1 int32, drop column col2, reset(prop), set (prop2 = 42, x=y), set a true",
  370. "ALTER EXTERNAL TABLE user\n\tADD COLUMN col1 int32,\n\tDROP COLUMN col2,\n\tRESET (prop),\n\tSET (prop2 = 42, x = y),\n\tSET a TRUE\n;\n"},
  371. {"dRop exTerNal taBlE usEr",
  372. "DROP EXTERNAL TABLE usEr;\n"},
  373. {"dRop exTerNal taBlE iF eXiStS usEr",
  374. "DROP EXTERNAL TABLE IF EXISTS usEr;\n"},
  375. };
  376. TSetup setup;
  377. setup.Run(cases);
  378. }
  379. Y_UNIT_TEST(TypeSelection) {
  380. TCases cases = {
  381. {"Select tYpe.* frOm Table tYpe",
  382. "SELECT\n\ttYpe.*\nFROM\n\tTable tYpe\n;\n"}
  383. };
  384. TSetup setup;
  385. setup.Run(cases);
  386. }
  387. Y_UNIT_TEST(AlterTable) {
  388. TCases cases = {
  389. {"alter table user add user int32",
  390. "ALTER TABLE user\n\tADD user int32\n;\n"},
  391. {"alter table user add user int32, add user bool ?",
  392. "ALTER TABLE user\n\tADD user int32,\n\tADD user bool?\n;\n"},
  393. {"alter table user add column user int32",
  394. "ALTER TABLE user\n\tADD COLUMN user int32\n;\n"},
  395. {"alter table user drop user",
  396. "ALTER TABLE user\n\tDROP user\n;\n"},
  397. {"alter table user drop column user",
  398. "ALTER TABLE user\n\tDROP COLUMN user\n;\n"},
  399. {"alter table user alter column user set family user",
  400. "ALTER TABLE user\n\tALTER COLUMN user SET FAMILY user\n;\n"},
  401. {"alter table t alter column c drop not null",
  402. "ALTER TABLE t\n\tALTER COLUMN c DROP NOT NULL\n;\n"},
  403. {"alter table user add family user(user='foo')",
  404. "ALTER TABLE user\n\tADD FAMILY user (user = 'foo')\n;\n"},
  405. {"alter table user alter family user set user 'foo'",
  406. "ALTER TABLE user\n\tALTER FAMILY user SET user 'foo'\n;\n"},
  407. {"alter table user set user user",
  408. "ALTER TABLE user\n\tSET user user\n;\n"},
  409. {"alter table user set (user=user)",
  410. "ALTER TABLE user\n\tSET (user = user)\n;\n"},
  411. {"alter table user set (user=user,user=user)",
  412. "ALTER TABLE user\n\tSET (user = user, user = user)\n;\n"},
  413. {"alter table user reset(user)",
  414. "ALTER TABLE user\n\tRESET (user)\n;\n"},
  415. {"alter table user reset(user, user)",
  416. "ALTER TABLE user\n\tRESET (user, user)\n;\n"},
  417. {"alter table user add index user local on (user)",
  418. "ALTER TABLE user\n\tADD INDEX user LOCAL ON (user)\n;\n"},
  419. {"alter table user alter index idx set setting 'foo'",
  420. "ALTER TABLE user\n\tALTER INDEX idx SET setting 'foo'\n;\n"},
  421. {"alter table user alter index idx set (setting = 'foo', another_setting = 'bar')",
  422. "ALTER TABLE user\n\tALTER INDEX idx SET (setting = 'foo', another_setting = 'bar')\n;\n"},
  423. {"alter table user alter index idx reset (setting, another_setting)",
  424. "ALTER TABLE user\n\tALTER INDEX idx RESET (setting, another_setting)\n;\n"},
  425. {"alter table user add index idx global using subtype on (col) cover (col) with (setting = foo, another_setting = 'bar');",
  426. "ALTER TABLE user\n\tADD INDEX idx GLOBAL USING subtype ON (col) COVER (col) WITH (setting = foo, another_setting = 'bar')\n;\n"},
  427. {"alter table user drop index user",
  428. "ALTER TABLE user\n\tDROP INDEX user\n;\n"},
  429. {"alter table user rename to user",
  430. "ALTER TABLE user\n\tRENAME TO user\n;\n"},
  431. {"alter table user add changefeed user with (user = 'foo')",
  432. "ALTER TABLE user\n\tADD CHANGEFEED user WITH (user = 'foo')\n;\n"},
  433. {"alter table user alter changefeed user disable",
  434. "ALTER TABLE user\n\tALTER CHANGEFEED user DISABLE\n;\n"},
  435. {"alter table user alter changefeed user set(user='foo')",
  436. "ALTER TABLE user\n\tALTER CHANGEFEED user SET (user = 'foo')\n;\n"},
  437. {"alter table user drop changefeed user",
  438. "ALTER TABLE user\n\tDROP CHANGEFEED user\n;\n"},
  439. {"alter table user add changefeed user with (initial_scan = tRUe)",
  440. "ALTER TABLE user\n\tADD CHANGEFEED user WITH (initial_scan = TRUE)\n;\n"},
  441. {"alter table user add changefeed user with (initial_scan = FaLsE)",
  442. "ALTER TABLE user\n\tADD CHANGEFEED user WITH (initial_scan = FALSE)\n;\n"},
  443. {"alter table user add changefeed user with (retention_period = Interval(\"P1D\"))",
  444. "ALTER TABLE user\n\tADD CHANGEFEED user WITH (retention_period = Interval('P1D'))\n;\n"},
  445. {"alter table user add changefeed user with (virtual_timestamps = TruE)",
  446. "ALTER TABLE user\n\tADD CHANGEFEED user WITH (virtual_timestamps = TRUE)\n;\n"},
  447. {"alter table user add changefeed user with (virtual_timestamps = fAlSe)",
  448. "ALTER TABLE user\n\tADD CHANGEFEED user WITH (virtual_timestamps = FALSE)\n;\n"},
  449. {"alter table user add changefeed user with (barriers_interval = Interval(\"PT1S\"))",
  450. "ALTER TABLE user\n\tADD CHANGEFEED user WITH (barriers_interval = Interval('PT1S'))\n;\n"},
  451. {"alter table user add changefeed user with (topic_min_active_partitions = 1)",
  452. "ALTER TABLE user\n\tADD CHANGEFEED user WITH (topic_min_active_partitions = 1)\n;\n"},
  453. {"alter table user add changefeed user with (topic_auto_partitioning = 'ENABLED', topic_min_active_partitions = 1, topic_max_active_partitions = 7)",
  454. "ALTER TABLE user\n\tADD CHANGEFEED user WITH (topic_auto_partitioning = 'ENABLED', topic_min_active_partitions = 1, topic_max_active_partitions = 7)\n;\n"},
  455. };
  456. TSetup setup;
  457. setup.Run(cases);
  458. }
  459. Y_UNIT_TEST(CreateTopic) {
  460. TCases cases = {
  461. {"create topic topic1",
  462. "CREATE TOPIC topic1;\n"},
  463. {"create topic topic1 (consumer c1)",
  464. "CREATE TOPIC topic1 (\n\tCONSUMER c1\n);\n"},
  465. {"create topic topic1 (consumer c1, consumer c2 with (important = True))",
  466. "CREATE TOPIC topic1 (\n\tCONSUMER c1,\n\tCONSUMER c2 WITH (important = TRUE)\n);\n"},
  467. {"create topic topic1 (consumer c1) with (partition_count_limit = 5)",
  468. "CREATE TOPIC topic1 (\n\tCONSUMER c1\n) WITH (\n\tpartition_count_limit = 5\n);\n"},
  469. };
  470. TSetup setup;
  471. setup.Run(cases);
  472. }
  473. Y_UNIT_TEST(AlterTopic) {
  474. TCases cases = {
  475. {"alter topic topic1 alter consumer c1 set (important = false)",
  476. "ALTER TOPIC topic1\n\tALTER CONSUMER c1 SET (important = FALSE)\n;\n"},
  477. {"alter topic topic1 alter consumer c1 set (important = false), alter consumer c2 reset (read_from)",
  478. "ALTER TOPIC topic1\n\tALTER CONSUMER c1 SET (important = FALSE),\n\tALTER CONSUMER c2 RESET (read_from)\n;\n"},
  479. {"alter topic topic1 add consumer c1, drop consumer c2",
  480. "ALTER TOPIC topic1\n\tADD CONSUMER c1,\n\tDROP CONSUMER c2\n;\n"},
  481. {"alter topic topic1 set (supported_codecs = 'RAW'), RESET (retention_period)",
  482. "ALTER TOPIC topic1\n\tSET (supported_codecs = 'RAW'),\n\tRESET (retention_period)\n;\n"},
  483. };
  484. TSetup setup;
  485. setup.Run(cases);
  486. }
  487. Y_UNIT_TEST(DropTopic) {
  488. TCases cases = {
  489. {"drop topic topic1",
  490. "DROP TOPIC topic1;\n"},
  491. };
  492. TSetup setup;
  493. setup.Run(cases);
  494. }
  495. Y_UNIT_TEST(TopicExistsStatement) {
  496. TCases cases = {
  497. {"drop topic if exists topic1",
  498. "DROP TOPIC IF EXISTS topic1;\n"},
  499. {"create topic if not exists topic1 with (partition_count_limit = 5)",
  500. "CREATE TOPIC IF NOT EXISTS topic1 WITH (\n\tpartition_count_limit = 5\n);\n"},
  501. {"alter topic if exists topic1 alter consumer c1 set (important = false)",
  502. "ALTER TOPIC IF EXISTS topic1\n\tALTER CONSUMER c1 SET (important = FALSE)\n;\n"},
  503. };
  504. TSetup setup;
  505. setup.Run(cases);
  506. }
  507. Y_UNIT_TEST(Do) {
  508. TCases cases = {
  509. {"do $a(1,2,3)",
  510. "DO\n\t$a(1, 2, 3)\n;\n"},
  511. {"do begin values(1); end do;",
  512. "DO BEGIN\n\tVALUES\n\t\t(1)\n\t;\nEND DO;\n"},
  513. };
  514. TSetup setup;
  515. setup.Run(cases);
  516. }
  517. Y_UNIT_TEST(DefineActionOrSubquery) {
  518. TCases cases = {
  519. {"define action $a() as "
  520. "define action $b() as "
  521. "values(1); "
  522. "end define; "
  523. "define subquery $c() as "
  524. "select 1; "
  525. "end define; "
  526. "do $b(); "
  527. "process $c(); "
  528. "end define",
  529. "DEFINE ACTION $a() AS\n\tDEFINE ACTION $b() AS\n\t\t"
  530. "VALUES\n\t\t\t(1)\n\t\t;\n\tEND DEFINE;\n\n\t"
  531. "DEFINE SUBQUERY $c() AS\n\t\tSELECT\n\t\t\t1\n\t\t;\n\t"
  532. "END DEFINE;\n\tDO\n\t\t$b()\n\t;\n\n\tPROCESS $c();\nEND DEFINE;\n"},
  533. {"define action $foo($bar) as;"
  534. "$a = 10;; "
  535. "$b = 20;;; "
  536. "$c = $a + $b "
  537. "end define",
  538. "DEFINE ACTION $foo($bar) AS\n\t"
  539. "$a = 10;\n\t"
  540. "$b = 20;\n\t"
  541. "$c = $a + $b;\n"
  542. "END DEFINE;\n"},
  543. {"define subquery $s() as;"
  544. "select * from $t1 "
  545. "union all select * from $t2 "
  546. "end define",
  547. "DEFINE SUBQUERY $s() AS\n\t"
  548. "SELECT\n\t\t*\n\tFROM\n\t\t$t1\n\t"
  549. "UNION ALL\n\t"
  550. "SELECT\n\t\t*\n\tFROM\n\t\t$t2\n\t;\n"
  551. "END DEFINE;\n"},
  552. {"define subquery $s() as $t = select * from $a end define",
  553. "DEFINE SUBQUERY $s() AS\n\t"
  554. "$t = (\n\t\tSELECT\n\t\t\t*\n\t\tFROM\n\t\t\t$a\n\t);\n"
  555. "END DEFINE;\n"},
  556. {"define subquery $s() as; $t = select * from $a; end define",
  557. "DEFINE SUBQUERY $s() AS\n\t"
  558. "$t = (\n\t\tSELECT\n\t\t\t*\n\t\tFROM\n\t\t\t$a\n\t);\n"
  559. "END DEFINE;\n"},
  560. };
  561. TSetup setup;
  562. setup.Run(cases);
  563. }
  564. Y_UNIT_TEST(If) {
  565. TCases cases = {
  566. {"evaluate if 1=1 do $a()",
  567. "EVALUATE IF 1 == 1 DO\n\t$a()\n;\n"},
  568. {"evaluate if 1=1 do $a() else do $b()",
  569. "EVALUATE IF 1 == 1 DO\n\t$a()\nELSE DO\n\t$b()\n;\n"},
  570. {"evaluate if 1=1 do begin select 1; end do",
  571. "EVALUATE IF 1 == 1 DO BEGIN\n\tSELECT\n\t\t1\n\t;\nEND DO;\n"},
  572. {"evaluate if 1=1 do begin select 1; end do else do begin select 2; end do",
  573. "EVALUATE IF 1 == 1 DO BEGIN\n\tSELECT\n\t\t1\n\t;\nEND DO "
  574. "ELSE DO BEGIN\n\tSELECT\n\t\t2\n\t;\nEND DO;\n"},
  575. {"evaluate if 1=1 do begin; select 1 end do else do begin select 2;; select 3 end do",
  576. "EVALUATE IF 1 == 1 DO BEGIN\n\tSELECT\n\t\t1\n\t;\nEND DO ELSE DO BEGIN\n\t"
  577. "SELECT\n\t\t2\n\t;\n\n\tSELECT\n\t\t3\n\t;\nEND DO;\n"},
  578. {"evaluate if 1=1 do begin (select 1) end do",
  579. "EVALUATE IF 1 == 1 DO BEGIN\n\t(\n\t\tSELECT\n\t\t\t1\n\t);\nEND DO;\n"},
  580. {"evaluate if 1=1 do begin $a = select * from $begin; $end = 1; end do",
  581. "EVALUATE IF 1 == 1 DO BEGIN\n\t$a = (\n\t\tSELECT\n\t\t\t*\n\t\tFROM\n\t\t\t$begin\n\t);\n\t$end = 1;\nEND DO;\n"},
  582. };
  583. TSetup setup;
  584. setup.Run(cases);
  585. }
  586. Y_UNIT_TEST(For) {
  587. TCases cases = {
  588. {"evaluate for $x in [] do $a($x)",
  589. "EVALUATE FOR $x IN [] DO\n\t$a($x)\n;\n"},
  590. {"evaluate for $x in [] do $a($x) else do $b()",
  591. "EVALUATE FOR $x IN [] DO\n\t$a($x)\nELSE DO\n\t$b()\n;\n"},
  592. {"evaluate for $x in [] do begin select $x; end do",
  593. "EVALUATE FOR $x IN [] DO BEGIN\n\tSELECT\n\t\t$x\n\t;\nEND DO;\n"},
  594. {"evaluate for $x in [] do begin select $x; end do else do begin select 2; end do",
  595. "EVALUATE FOR $x IN [] DO BEGIN\n\tSELECT\n\t\t$x\n\t;\nEND DO ELSE DO BEGIN\n\tSELECT\n\t\t2\n\t;\nEND DO;\n"},
  596. {"evaluate parallel for $x in [] do $a($x)",
  597. "EVALUATE PARALLEL FOR $x IN [] DO\n\t$a($x)\n;\n"},
  598. {"evaluate for $x in [] do begin; select $x;; select $y end do",
  599. "EVALUATE FOR $x IN [] DO BEGIN\n\tSELECT\n\t\t$x\n\t;\n\n\tSELECT\n\t\t$y\n\t;\nEND DO;\n"},
  600. {"evaluate for $x in [] do begin (select 1) end do",
  601. "EVALUATE FOR $x IN [] DO BEGIN\n\t(\n\t\tSELECT\n\t\t\t1\n\t);\nEND DO;\n"},
  602. {"evaluate for $x in [] do begin $a = select * from $begin; $end = 1; end do",
  603. "EVALUATE FOR $x IN [] DO BEGIN\n\t$a = (\n\t\tSELECT\n\t\t\t*\n\t\tFROM\n\t\t\t$begin\n\t);\n\t$end = 1;\nEND DO;\n"},
  604. };
  605. TSetup setup;
  606. setup.Run(cases);
  607. }
  608. Y_UNIT_TEST(Update) {
  609. TCases cases = {
  610. {"update user on default values",
  611. "UPDATE user\nON DEFAULT VALUES;\n"},
  612. {"update user on values (1),(2)",
  613. "UPDATE user\nON\nVALUES\n\t(1),\n\t(2)\n;\n"},
  614. {"update user on select 1 as x, 2 as y",
  615. "UPDATE user\nON\nSELECT\n\t1 AS x,\n\t2 AS y\n;\n"},
  616. {"update user on (x) values (1),(2),(3)",
  617. "UPDATE user\nON (\n\tx\n)\nVALUES\n\t(1),\n\t(2),\n\t(3)\n;\n"},
  618. {"update user on (x,y) values (1,2),(2,3),(3,4)",
  619. "UPDATE user\nON (\n\tx,\n\ty\n)\nVALUES\n\t(1, 2),\n\t(2, 3),\n\t(3, 4)\n;\n"},
  620. {"update user on (x) select 1",
  621. "UPDATE user\nON (\n\tx\n)\nSELECT\n\t1\n;\n"},
  622. {"update user on (x,y) select 1,2",
  623. "UPDATE user\nON (\n\tx,\n\ty\n)\nSELECT\n\t1,\n\t2\n;\n"},
  624. {"update user set x=1",
  625. "UPDATE user\nSET\n\tx = 1\n;\n"},
  626. {"update user set (x)=(1)",
  627. "UPDATE user\nSET\n(\n\tx\n) = (\n\t1\n);\n"},
  628. {"update user set (x,y)=(1,2)",
  629. "UPDATE user\nSET\n(\n\tx,\n\ty\n) = (\n\t1,\n\t2\n);\n"},
  630. {"update user set (x,y)=(select 1,2)",
  631. "UPDATE user\nSET\n(\n\tx,\n\ty\n) = (\n\tSELECT\n\t\t1,\n\t\t2\n);\n"},
  632. {"update user set x=1,y=2 where z=3",
  633. "UPDATE user\nSET\n\tx = 1,\n\ty = 2\nWHERE z == 3;\n"},
  634. };
  635. TSetup setup;
  636. setup.Run(cases);
  637. }
  638. Y_UNIT_TEST(Delete) {
  639. TCases cases = {
  640. {"delete from user",
  641. "DELETE FROM user;\n"},
  642. {"delete from user where 1=1",
  643. "DELETE FROM user\nWHERE 1 == 1;\n"},
  644. {"delete from user on select 1 as x, 2 as y",
  645. "DELETE FROM user\nON\nSELECT\n\t1 AS x,\n\t2 AS y\n;\n"},
  646. {"delete from user on (x) values (1)",
  647. "DELETE FROM user\nON (\n\tx\n)\nVALUES\n\t(1)\n;\n"},
  648. {"delete from user on (x,y) values (1,2), (3,4)",
  649. "DELETE FROM user\nON (\n\tx,\n\ty\n)\nVALUES\n\t(1, 2),\n\t(3, 4)\n;\n"},
  650. };
  651. TSetup setup;
  652. setup.Run(cases);
  653. }
  654. Y_UNIT_TEST(Into) {
  655. TCases cases = {
  656. {"insert into user select 1 as x",
  657. "INSERT INTO user\nSELECT\n\t1 AS x\n;\n"},
  658. {"insert or abort into user select 1 as x",
  659. "INSERT OR ABORT INTO user\nSELECT\n\t1 AS x\n;\n"},
  660. {"insert or revert into user select 1 as x",
  661. "INSERT OR REVERT INTO user\nSELECT\n\t1 AS x\n;\n"},
  662. {"insert or ignore into user select 1 as x",
  663. "INSERT OR IGNORE INTO user\nSELECT\n\t1 AS x\n;\n"},
  664. {"upsert into user select 1 as x",
  665. "UPSERT INTO user\nSELECT\n\t1 AS x\n;\n"},
  666. {"replace into user select 1 as x",
  667. "REPLACE INTO user\nSELECT\n\t1 AS x\n;\n"},
  668. {"insert into user(x) values (1)",
  669. "INSERT INTO user (\n\tx\n)\nVALUES\n\t(1)\n;\n"},
  670. {"insert into user(x,y) values (1,2)",
  671. "INSERT INTO user (\n\tx,\n\ty\n)\nVALUES\n\t(1, 2)\n;\n"},
  672. {"insert into plato.user select 1 as x",
  673. "INSERT INTO plato.user\nSELECT\n\t1 AS x\n;\n"},
  674. {"insert into @user select 1 as x",
  675. "INSERT INTO @user\nSELECT\n\t1 AS x\n;\n"},
  676. {"insert into $user select 1 as x",
  677. "INSERT INTO $user\nSELECT\n\t1 AS x\n;\n"},
  678. {"insert into @$user select 1 as x",
  679. "INSERT INTO @$user\nSELECT\n\t1 AS x\n;\n"},
  680. {"upsert into user erase by (x,y) values (1)",
  681. "UPSERT INTO user\n\tERASE BY (\n\t\tx,\n\t\ty\n\t)\nVALUES\n\t(1)\n;\n"},
  682. {"insert into user with truncate select 1 as x",
  683. "INSERT INTO user WITH truncate\nSELECT\n\t1 AS x\n;\n"},
  684. {"insert into user with (truncate,inferscheme='1') select 1 as x",
  685. "INSERT INTO user WITH (\n\ttruncate,\n\tinferscheme = '1'\n)\nSELECT\n\t1 AS x\n;\n"},
  686. {"insert into user with schema Struct<user:int32> select 1 as user",
  687. "INSERT INTO user WITH SCHEMA Struct<user: int32>\nSELECT\n\t1 AS user\n;\n"},
  688. {"insert into user with schema (int32 as user) select 1 as user",
  689. "INSERT INTO user WITH SCHEMA (int32 AS user)\nSELECT\n\t1 AS user\n;\n"},
  690. };
  691. TSetup setup;
  692. setup.Run(cases);
  693. }
  694. Y_UNIT_TEST(Process) {
  695. TCases cases = {
  696. {"process user",
  697. "PROCESS user;\n"},
  698. {"process user using $f() as user",
  699. "PROCESS user\nUSING $f() AS user;\n"},
  700. {"process user,user using $f()",
  701. "PROCESS user, user\nUSING $f();\n"},
  702. {"process user using $f() where 1=1 having 1=1 assume order by user",
  703. "PROCESS user\nUSING $f()\nWHERE\n\t1 == 1\nHAVING\n\t1 == 1\nASSUME ORDER BY\n\tuser\n;\n"},
  704. {"process user using $f() union all process user using $f()",
  705. "PROCESS user\nUSING $f()\nUNION ALL\nPROCESS user\nUSING $f();\n"},
  706. {"process user using $f() with foo=bar",
  707. "PROCESS user\nUSING $f()\nWITH foo = bar;\n"},
  708. {"discard process user using $f()",
  709. "DISCARD PROCESS user\nUSING $f();\n"},
  710. {"process user using $f() into result user",
  711. "PROCESS user\nUSING $f()\nINTO RESULT user;\n"},
  712. };
  713. TSetup setup;
  714. setup.Run(cases);
  715. }
  716. Y_UNIT_TEST(Reduce) {
  717. TCases cases = {
  718. {"reduce user on user using $f()",
  719. "REDUCE user\nON\n\tuser\nUSING $f();\n"},
  720. {"reduce user on user, using $f()",
  721. "REDUCE user\nON\n\tuser,\nUSING $f();\n"},
  722. {"discard reduce user on user using $f();",
  723. "DISCARD REDUCE user\nON\n\tuser\nUSING $f();\n"},
  724. {"reduce user on user using $f() into result user",
  725. "REDUCE user\nON\n\tuser\nUSING $f()\nINTO RESULT user;\n"},
  726. {"reduce user on user using all $f()",
  727. "REDUCE user\nON\n\tuser\nUSING ALL $f();\n"},
  728. {"reduce user on user using $f() as user",
  729. "REDUCE user\nON\n\tuser\nUSING $f() AS user;\n"},
  730. {"reduce user,user on user using $f()",
  731. "REDUCE user, user\nON\n\tuser\nUSING $f();\n"},
  732. {"reduce user on user,user using $f()",
  733. "REDUCE user\nON\n\tuser,\n\tuser\nUSING $f();\n"},
  734. {"reduce user on user using $f() where 1=1 having 1=1 assume order by user",
  735. "REDUCE user\nON\n\tuser\nUSING $f()\nWHERE\n\t1 == 1\nHAVING\n\t1 == 1\nASSUME ORDER BY\n\tuser\n;\n"},
  736. {"reduce user presort user,user on user using $f();",
  737. "REDUCE user\nPRESORT\n\tuser,\n\tuser\nON\n\tuser\nUSING $f();\n"},
  738. };
  739. TSetup setup;
  740. setup.Run(cases);
  741. }
  742. Y_UNIT_TEST(Select) {
  743. TCases cases = {
  744. {"select 1",
  745. "SELECT\n\t1\n;\n"},
  746. {"select 1,",
  747. "SELECT\n\t1,\n;\n"},
  748. {"select 1 as x",
  749. "SELECT\n\t1 AS x\n;\n"},
  750. {"select *",
  751. "SELECT\n\t*\n;\n"},
  752. {"select a.*",
  753. "SELECT\n\ta.*\n;\n"},
  754. {"select * without a",
  755. "SELECT\n\t*\nWITHOUT\n\ta\n;\n"},
  756. {"select * without a,b",
  757. "SELECT\n\t*\nWITHOUT\n\ta,\n\tb\n;\n"},
  758. {"select * without a,",
  759. "SELECT\n\t*\nWITHOUT\n\ta,\n;\n"},
  760. {"select 1 from user",
  761. "SELECT\n\t1\nFROM\n\tuser\n;\n"},
  762. {"select 1 from plato.user",
  763. "SELECT\n\t1\nFROM\n\tplato.user\n;\n"},
  764. {"select 1 from $user",
  765. "SELECT\n\t1\nFROM\n\t$user\n;\n"},
  766. {"select 1 from @user",
  767. "SELECT\n\t1\nFROM\n\t@user\n;\n"},
  768. {"select 1 from @$user",
  769. "SELECT\n\t1\nFROM\n\t@$user\n;\n"},
  770. {"select 1 from user view user",
  771. "SELECT\n\t1\nFROM\n\tuser VIEW user\n;\n"},
  772. {"select 1 from user as user",
  773. "SELECT\n\t1\nFROM\n\tuser AS user\n;\n"},
  774. {"select 1 from user as user(user)",
  775. "SELECT\n\t1\nFROM\n\tuser AS user (\n\t\tuser\n\t)\n;\n"},
  776. {"select 1 from user as user(user, user)",
  777. "SELECT\n\t1\nFROM\n\tuser AS user (\n\t\tuser,\n\t\tuser\n\t)\n;\n"},
  778. {"select 1 from user with user=user",
  779. "SELECT\n\t1\nFROM\n\tuser WITH user = user\n;\n"},
  780. {"select 1 from user with (user=user, user=user)",
  781. "SELECT\n\t1\nFROM\n\tuser WITH (\n\t\tuser = user,\n\t\tuser = user\n\t)\n;\n"},
  782. {"select 1 from user sample 0.1",
  783. "SELECT\n\t1\nFROM\n\tuser\n\tSAMPLE 0.1\n;\n"},
  784. {"select 1 from user tablesample system(0.1)",
  785. "SELECT\n\t1\nFROM\n\tuser\n\tTABLESAMPLE SYSTEM (0.1)\n;\n"},
  786. {"select 1 from user tablesample bernoulli(0.1) repeatable(10)",
  787. "SELECT\n\t1\nFROM\n\tuser\n\tTABLESAMPLE BERNOULLI (0.1) REPEATABLE (10)\n;\n"},
  788. {"select 1 from user flatten columns",
  789. "SELECT\n\t1\nFROM\n\tuser\n\tFLATTEN COLUMNS\n;\n"},
  790. {"select 1 from user flatten list by user",
  791. "SELECT\n\t1\nFROM\n\tuser\n\tFLATTEN LIST BY user\n;\n"},
  792. {"select 1 from user flatten list by (user,user)",
  793. "SELECT\n\t1\nFROM\n\tuser\n\tFLATTEN LIST BY (\n\t\tuser,\n\t\tuser\n\t)\n;\n"},
  794. {"select 1 from $user(1,2)",
  795. "SELECT\n\t1\nFROM\n\t$user(1, 2)\n;\n"},
  796. {"select 1 from $user(1,2) view user",
  797. "SELECT\n\t1\nFROM\n\t$user(1, 2) VIEW user\n;\n"},
  798. {"select 1 from range('a','b')",
  799. "SELECT\n\t1\nFROM\n\trange('a', 'b')\n;\n"},
  800. {"from user select 1",
  801. "FROM\n\tuser\nSELECT\n\t1\n;\n"},
  802. {"select * from user as a join user as b on a.x=b.y",
  803. "SELECT\n\t*\nFROM\n\tuser AS a\nJOIN\n\tuser AS b\nON\n\ta.x == b.y\n;\n"},
  804. {"select * from user as a join user as b using(x)",
  805. "SELECT\n\t*\nFROM\n\tuser AS a\nJOIN\n\tuser AS b\nUSING (x);\n"},
  806. {"select * from any user as a full join user as b on a.x=b.y",
  807. "SELECT\n\t*\nFROM ANY\n\tuser AS a\nFULL JOIN\n\tuser AS b\nON\n\ta.x == b.y\n;\n"},
  808. {"select * from user as a left join any user as b on a.x=b.y",
  809. "SELECT\n\t*\nFROM\n\tuser AS a\nLEFT JOIN ANY\n\tuser AS b\nON\n\ta.x == b.y\n;\n"},
  810. {"select * from any user as a right join any user as b on a.x=b.y",
  811. "SELECT\n\t*\nFROM ANY\n\tuser AS a\nRIGHT JOIN ANY\n\tuser AS b\nON\n\ta.x == b.y\n;\n"},
  812. {"select * from user as a cross join user as b",
  813. "SELECT\n\t*\nFROM\n\tuser AS a\nCROSS JOIN\n\tuser AS b\n;\n"},
  814. {"select 1 from user where key = 1",
  815. "SELECT\n\t1\nFROM\n\tuser\nWHERE\n\tkey == 1\n;\n"},
  816. {"select 1 from user having count(*) = 1",
  817. "SELECT\n\t1\nFROM\n\tuser\nHAVING\n\tcount(*) == 1\n;\n"},
  818. {"select 1 from user group by key",
  819. "SELECT\n\t1\nFROM\n\tuser\nGROUP BY\n\tkey\n;\n"},
  820. {"select 1 from user group compact by key, value as v",
  821. "SELECT\n\t1\nFROM\n\tuser\nGROUP COMPACT BY\n\tkey,\n\tvalue AS v\n;\n"},
  822. {"select 1 from user group by key with combine",
  823. "SELECT\n\t1\nFROM\n\tuser\nGROUP BY\n\tkey\n\tWITH combine\n;\n"},
  824. {"select 1 from user order by key asc",
  825. "SELECT\n\t1\nFROM\n\tuser\nORDER BY\n\tkey ASC\n;\n"},
  826. {"select 1 from user order by key, value desc",
  827. "SELECT\n\t1\nFROM\n\tuser\nORDER BY\n\tkey,\n\tvalue DESC\n;\n"},
  828. {"select 1 from user assume order by key",
  829. "SELECT\n\t1\nFROM\n\tuser\nASSUME ORDER BY\n\tkey\n;\n"},
  830. {"select 1 from user window w1 as (), w2 as ()",
  831. "SELECT\n\t1\nFROM\n\tuser\nWINDOW\n\tw1 AS (),\n\tw2 AS ()\n;\n"},
  832. {"select 1 from user window w1 as (user)",
  833. "SELECT\n\t1\nFROM\n\tuser\nWINDOW\n\tw1 AS (\n\t\tuser\n\t)\n;\n"},
  834. {"select 1 from user window w1 as (partition by user)",
  835. "SELECT\n\t1\nFROM\n\tuser\nWINDOW\n\tw1 AS (\n\t\tPARTITION BY\n\t\t\tuser\n\t)\n;\n"},
  836. {"select 1 from user window w1 as (partition by user, user)",
  837. "SELECT\n\t1\nFROM\n\tuser\nWINDOW\n\tw1 AS (\n\t\tPARTITION BY\n\t\t\tuser,\n\t\t\tuser\n\t)\n;\n"},
  838. {"select 1 from user window w1 as (order by user asc)",
  839. "SELECT\n\t1\nFROM\n\tuser\nWINDOW\n\tw1 AS (\n\t\tORDER BY\n\t\t\tuser ASC\n\t)\n;\n"},
  840. {"select 1 from user window w1 as (order by user, user desc)",
  841. "SELECT\n\t1\nFROM\n\tuser\nWINDOW\n\tw1 AS (\n\t\tORDER BY\n\t\t\tuser,\n\t\t\tuser DESC\n\t)\n;\n"},
  842. {"select 1 from user window w1 as (rows between 1 preceding and 1 following)",
  843. "SELECT\n\t1\nFROM\n\tuser\nWINDOW\n\tw1 AS (\n\t\tROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING\n\t)\n;\n"},
  844. {"select 1 limit 10",
  845. "SELECT\n\t1\nLIMIT 10;\n"},
  846. {"select 1 limit 10 offset 5",
  847. "SELECT\n\t1\nLIMIT 10 OFFSET 5;\n"},
  848. {"select 1 union all select 2",
  849. "SELECT\n\t1\nUNION ALL\nSELECT\n\t2\n;\n" },
  850. {"select * from $user where key == 1 -- comment",
  851. "SELECT\n\t*\nFROM\n\t$user\nWHERE\n\tkey == 1 -- comment\n;\n"},
  852. };
  853. TSetup setup;
  854. setup.Run(cases);
  855. }
  856. Y_UNIT_TEST(CompositeTypesAndQuestions) {
  857. TCases cases = {
  858. {"declare $_x AS list<int32>??;declare $_y AS int32 ? ? ;select 1<>2, 1??2,"
  859. "formattype(list<int32>), formattype(resource<user>),formattype(tuple<>), formattype(tuple< >), formattype(int32 ? ? )",
  860. "DECLARE $_x AS list<int32>??;\nDECLARE $_y AS int32??;\n\nSELECT\n\t1 != 2,\n\t1 ?? 2,\n\tformattype(list<int32>),"
  861. "\n\tformattype(resource<user>),\n\tformattype(tuple<>),\n\tformattype(tuple< >),\n\tformattype(int32??" ")\n;\n"
  862. },
  863. };
  864. TSetup setup;
  865. setup.Run(cases);
  866. }
  867. Y_UNIT_TEST(Lambda) {
  868. TCases cases = {
  869. {"$f=($a,$b)->{$x=$a+$b;return $a*$x};$g=($a,$b?)->($a+$b??0);select $f(10,4),$g(1,2);",
  870. "$f = ($a, $b) -> {\n\t$x = $a + $b;\n\tRETURN $a * $x;\n};\n\n"
  871. "$g = ($a, $b?) -> ($a + $b ?? 0);\n\n"
  872. "SELECT\n\t$f(10, 4),\n\t$g(1, 2)\n;\n"},
  873. {"$f=($arg)->{;$a=10;;$b=20;;;RETURN $a+$b}",
  874. "$f = ($arg) -> {\n\t$a = 10;\n\t$b = 20;\n\tRETURN $a + $b;\n};\n"},
  875. };
  876. TSetup setup;
  877. setup.Run(cases);
  878. }
  879. Y_UNIT_TEST(NestedSelect) {
  880. TCases cases = {
  881. {"$x=select 1",
  882. "$x = (\n\tSELECT\n\t\t1\n);\n"},
  883. {"$x=(select 1)",
  884. "$x = (\n\tSELECT\n\t\t1\n);\n"},
  885. {"$x=((select 1))",
  886. "$x = (\n\t(\n\t\tSELECT\n\t\t\t1\n\t)\n);\n"},
  887. {"select 1 in (select 1)",
  888. "SELECT\n\t1 IN (\n\t\tSELECT\n\t\t\t1\n\t)\n;\n"},
  889. {"select 1 in ((select 1))",
  890. "SELECT\n\t1 IN (\n\t\t(\n\t\t\tSELECT\n\t\t\t\t1\n\t\t)\n\t)\n;\n"},
  891. {"select 1 in (\nselect 1)",
  892. "SELECT\n\t1 IN (\n\t\tSELECT\n\t\t\t1\n\t)\n;\n"},
  893. };
  894. TSetup setup;
  895. setup.Run(cases);
  896. }
  897. Y_UNIT_TEST(Cast) {
  898. TCases cases = {
  899. {"select cast(1 as string)","SELECT\n\tCAST(1 AS string)\n;\n"},
  900. {"select bitcast(1 as int32)","SELECT\n\tBITCAST(1 AS int32)\n;\n"},
  901. };
  902. TSetup setup;
  903. setup.Run(cases);
  904. }
  905. Y_UNIT_TEST(StructLiteral) {
  906. TCases cases = {
  907. {"select <||>","SELECT\n\t<||>\n;\n"},
  908. {"select <|a:1|>","SELECT\n\t<|a: 1|>\n;\n"},
  909. {"select <|a:1,b:2|>","SELECT\n\t<|a: 1, b: 2|>\n;\n"},
  910. };
  911. TSetup setup;
  912. setup.Run(cases);
  913. }
  914. Y_UNIT_TEST(TableHints) {
  915. TCases cases = {
  916. {"select * from plato.T with schema(foo int32, bar list<string>) where key is not null",
  917. "SELECT\n\t*\nFROM\n\tplato.T WITH SCHEMA (foo int32, bar list<string>)\nWHERE\n\tkey IS NOT NULL\n;\n"},
  918. {"select * from plato.T with schema struct<foo:integer, Bar:list<string?>> where key<0",
  919. "SELECT\n\t*\nFROM\n\tplato.T WITH SCHEMA struct<foo: integer, Bar: list<string?>>\nWHERE\n\tkey < 0\n;\n"},
  920. {"select * from plato.T with (foo=bar, x=$y, a=(a, b, c), u='aaa', schema (foo int32, bar list<string>))",
  921. "SELECT\n\t*\nFROM\n\tplato.T WITH (\n\t\tfoo = bar,\n\t\tx = $y,\n\t\ta = (a, b, c),\n\t\tu = 'aaa',\n\t\tSCHEMA (foo int32, bar list<string>)\n\t)\n;\n"},
  922. {"select * from plato.T with schema struct<\nfoo:int32,\nbar:double\n> as a",
  923. "SELECT\n\t*\nFROM\n\tplato.T WITH SCHEMA struct<\n\t\tfoo: int32,\n\t\tbar: double\n\t> AS a\n;\n"},
  924. };
  925. TSetup setup;
  926. setup.Run(cases);
  927. }
  928. Y_UNIT_TEST(BoolAsVariableName) {
  929. TCases cases = {
  930. {"$ False = True; select $ False;",
  931. "$False = TRUE;\n\nSELECT\n\t$False\n;\n"},
  932. };
  933. TSetup setup;
  934. setup.Run(cases);
  935. }
  936. Y_UNIT_TEST(WithSchemaEquals) {
  937. TCases cases = {
  938. {"select * from plato.T with (format= csv_with_names, schema=(year int32 Null, month String, day String not null, a Utf8, b Uint16));",
  939. "SELECT\n\t*\nFROM\n\tplato.T WITH (\n\t\tformat = csv_with_names,\n\t\tSCHEMA = (year int32 NULL, month String, day String NOT NULL, a Utf8, b Uint16)\n\t)\n;\n"},
  940. };
  941. TSetup setup;
  942. setup.Run(cases);
  943. }
  944. Y_UNIT_TEST(SquareBrackets) {
  945. TCases cases = {
  946. {"select a[0]",
  947. "SELECT\n\ta[0]\n;\n"},
  948. };
  949. TSetup setup;
  950. setup.Run(cases);
  951. }
  952. Y_UNIT_TEST(MultiLineList) {
  953. TCases cases = {
  954. {"select [\n]",
  955. "SELECT\n\t[\n\t]\n;\n"},
  956. {"select [1\n]",
  957. "SELECT\n\t[\n\t\t1\n\t]\n;\n"},
  958. {"select [\n1]",
  959. "SELECT\n\t[\n\t\t1\n\t]\n;\n"},
  960. {"select [1,\n]",
  961. "SELECT\n\t[\n\t\t1,\n\t]\n;\n"},
  962. {"select [1\n,]",
  963. "SELECT\n\t[\n\t\t1,\n\t]\n;\n"},
  964. {"select [\n1,]",
  965. "SELECT\n\t[\n\t\t1,\n\t]\n;\n"},
  966. {"select [1,2,\n3,4]",
  967. "SELECT\n\t[\n\t\t1, 2,\n\t\t3, 4\n\t]\n;\n"},
  968. {"select [1,2,\n3,4,]",
  969. "SELECT\n\t[\n\t\t1, 2,\n\t\t3, 4,\n\t]\n;\n"},
  970. {"select [1,2\n,3,\n4\n,5]",
  971. "SELECT\n\t[\n\t\t1, 2,\n\t\t3,\n\t\t4,\n\t\t5\n\t]\n;\n"},
  972. };
  973. TSetup setup;
  974. setup.Run(cases);
  975. }
  976. Y_UNIT_TEST(MultiLineTuple) {
  977. TCases cases = {
  978. {"select (\n)",
  979. "SELECT\n\t(\n\t)\n;\n"},
  980. {"select (1,\n)",
  981. "SELECT\n\t(\n\t\t1,\n\t)\n;\n"},
  982. {"select (1\n,)",
  983. "SELECT\n\t(\n\t\t1,\n\t)\n;\n"},
  984. {"select (\n1,)",
  985. "SELECT\n\t(\n\t\t1,\n\t)\n;\n"},
  986. {"select (1,2,\n3,4)",
  987. "SELECT\n\t(\n\t\t1, 2,\n\t\t3, 4\n\t)\n;\n"},
  988. {"select (1,2,\n3,4,)",
  989. "SELECT\n\t(\n\t\t1, 2,\n\t\t3, 4,\n\t)\n;\n"},
  990. };
  991. TSetup setup;
  992. setup.Run(cases);
  993. }
  994. Y_UNIT_TEST(MultiLineSet) {
  995. TCases cases = {
  996. {"select {\n}",
  997. "SELECT\n\t{\n\t}\n;\n"},
  998. {"select {1\n}",
  999. "SELECT\n\t{\n\t\t1\n\t}\n;\n"},
  1000. {"select {\n1}",
  1001. "SELECT\n\t{\n\t\t1\n\t}\n;\n"},
  1002. {"select {1,\n}",
  1003. "SELECT\n\t{\n\t\t1,\n\t}\n;\n"},
  1004. {"select {1\n,}",
  1005. "SELECT\n\t{\n\t\t1,\n\t}\n;\n"},
  1006. {"select {\n1,}",
  1007. "SELECT\n\t{\n\t\t1,\n\t}\n;\n"},
  1008. {"select {1,2,\n3,4}",
  1009. "SELECT\n\t{\n\t\t1, 2,\n\t\t3, 4\n\t}\n;\n"},
  1010. {"select {1,2,\n3,4,}",
  1011. "SELECT\n\t{\n\t\t1, 2,\n\t\t3, 4,\n\t}\n;\n"},
  1012. };
  1013. TSetup setup;
  1014. setup.Run(cases);
  1015. }
  1016. Y_UNIT_TEST(MultiLineDict) {
  1017. TCases cases = {
  1018. {"select {0:1\n}",
  1019. "SELECT\n\t{\n\t\t0: 1\n\t}\n;\n"},
  1020. {"select {\n0:1}",
  1021. "SELECT\n\t{\n\t\t0: 1\n\t}\n;\n"},
  1022. {"select {0:1,\n}",
  1023. "SELECT\n\t{\n\t\t0: 1,\n\t}\n;\n"},
  1024. {"select {0:1\n,}",
  1025. "SELECT\n\t{\n\t\t0: 1,\n\t}\n;\n"},
  1026. {"select {\n0:1,}",
  1027. "SELECT\n\t{\n\t\t0: 1,\n\t}\n;\n"},
  1028. {"select {10:1,20:2,\n30:3,40:4}",
  1029. "SELECT\n\t{\n\t\t10: 1, 20: 2,\n\t\t30: 3, 40: 4\n\t}\n;\n"},
  1030. {"select {10:1,20:2,\n30:3,40:4,}",
  1031. "SELECT\n\t{\n\t\t10: 1, 20: 2,\n\t\t30: 3, 40: 4,\n\t}\n;\n"},
  1032. };
  1033. TSetup setup;
  1034. setup.Run(cases);
  1035. }
  1036. Y_UNIT_TEST(MultiLineFuncCall) {
  1037. TCases cases = {
  1038. {"select f(\n)",
  1039. "SELECT\n\tf(\n\t)\n;\n"},
  1040. {"select f(1\n)",
  1041. "SELECT\n\tf(\n\t\t1\n\t)\n;\n"},
  1042. {"select f(\n1)",
  1043. "SELECT\n\tf(\n\t\t1\n\t)\n;\n"},
  1044. {"select f(1,\n)",
  1045. "SELECT\n\tf(\n\t\t1,\n\t)\n;\n"},
  1046. {"select f(1\n,)",
  1047. "SELECT\n\tf(\n\t\t1,\n\t)\n;\n"},
  1048. {"select f(\n1,)",
  1049. "SELECT\n\tf(\n\t\t1,\n\t)\n;\n"},
  1050. {"select f(1,2,\n3,4)",
  1051. "SELECT\n\tf(\n\t\t1, 2,\n\t\t3, 4\n\t)\n;\n"},
  1052. {"select f(1,2,\n3,4,)",
  1053. "SELECT\n\tf(\n\t\t1, 2,\n\t\t3, 4,\n\t)\n;\n"},
  1054. };
  1055. TSetup setup;
  1056. setup.Run(cases);
  1057. }
  1058. Y_UNIT_TEST(MultiLineStruct) {
  1059. TCases cases = {
  1060. {"select <|\n|>",
  1061. "SELECT\n\t<|\n\t|>\n;\n"},
  1062. {"select <|a:1\n|>",
  1063. "SELECT\n\t<|\n\t\ta: 1\n\t|>\n;\n"},
  1064. {"select <|\na:1|>",
  1065. "SELECT\n\t<|\n\t\ta: 1\n\t|>\n;\n"},
  1066. {"select <|a:1,\n|>",
  1067. "SELECT\n\t<|\n\t\ta: 1,\n\t|>\n;\n"},
  1068. {"select <|a:1\n,|>",
  1069. "SELECT\n\t<|\n\t\ta: 1,\n\t|>\n;\n"},
  1070. {"select <|\na:1,|>",
  1071. "SELECT\n\t<|\n\t\ta: 1,\n\t|>\n;\n"},
  1072. {"select <|a:1,b:2,\nc:3,d:4|>",
  1073. "SELECT\n\t<|\n\t\ta: 1, b: 2,\n\t\tc: 3, d: 4\n\t|>\n;\n"},
  1074. {"select <|a:1,b:2,\nc:3,d:4,|>",
  1075. "SELECT\n\t<|\n\t\ta: 1, b: 2,\n\t\tc: 3, d: 4,\n\t|>\n;\n"},
  1076. };
  1077. TSetup setup;
  1078. setup.Run(cases);
  1079. }
  1080. Y_UNIT_TEST(MultiLineListType) {
  1081. TCases cases = {
  1082. {"select list<int32\n>",
  1083. "SELECT\n\tlist<\n\t\tint32\n\t>\n;\n"},
  1084. {"select list<\nint32>",
  1085. "SELECT\n\tlist<\n\t\tint32\n\t>\n;\n"},
  1086. };
  1087. TSetup setup;
  1088. setup.Run(cases);
  1089. }
  1090. Y_UNIT_TEST(MultiLineOptionalType) {
  1091. TCases cases = {
  1092. {"select optional<int32\n>",
  1093. "SELECT\n\toptional<\n\t\tint32\n\t>\n;\n"},
  1094. {"select optional<\nint32>",
  1095. "SELECT\n\toptional<\n\t\tint32\n\t>\n;\n"},
  1096. };
  1097. TSetup setup;
  1098. setup.Run(cases);
  1099. }
  1100. Y_UNIT_TEST(MultiLineStreamType) {
  1101. TCases cases = {
  1102. {"select stream<int32\n>",
  1103. "SELECT\n\tstream<\n\t\tint32\n\t>\n;\n"},
  1104. {"select stream<\nint32>",
  1105. "SELECT\n\tstream<\n\t\tint32\n\t>\n;\n"},
  1106. };
  1107. TSetup setup;
  1108. setup.Run(cases);
  1109. }
  1110. Y_UNIT_TEST(MultiLineFlowType) {
  1111. TCases cases = {
  1112. {"select flow<int32\n>",
  1113. "SELECT\n\tflow<\n\t\tint32\n\t>\n;\n"},
  1114. {"select flow<\nint32>",
  1115. "SELECT\n\tflow<\n\t\tint32\n\t>\n;\n"},
  1116. };
  1117. TSetup setup;
  1118. setup.Run(cases);
  1119. }
  1120. Y_UNIT_TEST(MultiLineSetType) {
  1121. TCases cases = {
  1122. {"select set<int32\n>",
  1123. "SELECT\n\tset<\n\t\tint32\n\t>\n;\n"},
  1124. {"select set<\nint32>",
  1125. "SELECT\n\tset<\n\t\tint32\n\t>\n;\n"},
  1126. };
  1127. TSetup setup;
  1128. setup.Run(cases);
  1129. }
  1130. Y_UNIT_TEST(MultiLineTupleType) {
  1131. TCases cases = {
  1132. {"select tuple<\n>",
  1133. "SELECT\n\ttuple<\n\t\t \n\t>\n;\n"},
  1134. {"select tuple<int32\n>",
  1135. "SELECT\n\ttuple<\n\t\tint32\n\t>\n;\n"},
  1136. {"select tuple<\nint32>",
  1137. "SELECT\n\ttuple<\n\t\tint32\n\t>\n;\n"},
  1138. {"select tuple<int32,\n>",
  1139. "SELECT\n\ttuple<\n\t\tint32,\n\t>\n;\n"},
  1140. {"select tuple<int32\n,>",
  1141. "SELECT\n\ttuple<\n\t\tint32,\n\t>\n;\n"},
  1142. {"select tuple<\nint32,>",
  1143. "SELECT\n\ttuple<\n\t\tint32,\n\t>\n;\n"},
  1144. {"select tuple<\nint32,string,\ndouble,bool>",
  1145. "SELECT\n\ttuple<\n\t\tint32, string,\n\t\tdouble, bool\n\t>\n;\n"},
  1146. {"select tuple<\nint32,string,\ndouble,bool,>",
  1147. "SELECT\n\ttuple<\n\t\tint32, string,\n\t\tdouble, bool,\n\t>\n;\n"},
  1148. };
  1149. TSetup setup;
  1150. setup.Run(cases);
  1151. }
  1152. Y_UNIT_TEST(MultiLineStructType) {
  1153. TCases cases = {
  1154. {"select struct<\n>",
  1155. "SELECT\n\tstruct<\n\t\t \n\t>\n;\n"},
  1156. {"select struct<a:int32\n>",
  1157. "SELECT\n\tstruct<\n\t\ta: int32\n\t>\n;\n"},
  1158. {"select struct<\na:int32>",
  1159. "SELECT\n\tstruct<\n\t\ta: int32\n\t>\n;\n"},
  1160. {"select struct<a:int32,\n>",
  1161. "SELECT\n\tstruct<\n\t\ta: int32,\n\t>\n;\n"},
  1162. {"select struct<a:int32\n,>",
  1163. "SELECT\n\tstruct<\n\t\ta: int32,\n\t>\n;\n"},
  1164. {"select struct<\na:int32,>",
  1165. "SELECT\n\tstruct<\n\t\ta: int32,\n\t>\n;\n"},
  1166. {"select struct<\na:int32,b:string,\nc:double,d:bool>",
  1167. "SELECT\n\tstruct<\n\t\ta: int32, b: string,\n\t\tc: double, d: bool\n\t>\n;\n"},
  1168. {"select struct<\na:int32,b:string,\nc:double,d:bool,>",
  1169. "SELECT\n\tstruct<\n\t\ta: int32, b: string,\n\t\tc: double, d: bool,\n\t>\n;\n"},
  1170. };
  1171. TSetup setup;
  1172. setup.Run(cases);
  1173. }
  1174. Y_UNIT_TEST(MultiLineVariantOverTupleType) {
  1175. TCases cases = {
  1176. {"select variant<int32\n>",
  1177. "SELECT\n\tvariant<\n\t\tint32\n\t>\n;\n"},
  1178. {"select variant<\nint32>",
  1179. "SELECT\n\tvariant<\n\t\tint32\n\t>\n;\n"},
  1180. {"select variant<int32,\n>",
  1181. "SELECT\n\tvariant<\n\t\tint32,\n\t>\n;\n"},
  1182. {"select variant<int32\n,>",
  1183. "SELECT\n\tvariant<\n\t\tint32,\n\t>\n;\n"},
  1184. {"select variant<\nint32,>",
  1185. "SELECT\n\tvariant<\n\t\tint32,\n\t>\n;\n"},
  1186. {"select variant<\nint32,string,\ndouble,bool>",
  1187. "SELECT\n\tvariant<\n\t\tint32, string,\n\t\tdouble, bool\n\t>\n;\n"},
  1188. {"select variant<\nint32,string,\ndouble,bool,>",
  1189. "SELECT\n\tvariant<\n\t\tint32, string,\n\t\tdouble, bool,\n\t>\n;\n"},
  1190. };
  1191. TSetup setup;
  1192. setup.Run(cases);
  1193. }
  1194. Y_UNIT_TEST(MultiLineVariantOverStructType) {
  1195. TCases cases = {
  1196. {"select variant<a:int32\n>",
  1197. "SELECT\n\tvariant<\n\t\ta: int32\n\t>\n;\n"},
  1198. {"select variant<\na:int32>",
  1199. "SELECT\n\tvariant<\n\t\ta: int32\n\t>\n;\n"},
  1200. {"select variant<a:int32,\n>",
  1201. "SELECT\n\tvariant<\n\t\ta: int32,\n\t>\n;\n"},
  1202. {"select variant<a:int32\n,>",
  1203. "SELECT\n\tvariant<\n\t\ta: int32,\n\t>\n;\n"},
  1204. {"select variant<\na:int32,>",
  1205. "SELECT\n\tvariant<\n\t\ta: int32,\n\t>\n;\n"},
  1206. {"select variant<\na:int32,b:string,\nc:double,d:bool>",
  1207. "SELECT\n\tvariant<\n\t\ta: int32, b: string,\n\t\tc: double, d: bool\n\t>\n;\n"},
  1208. {"select variant<\na:int32,b:string,\nc:double,d:bool,>",
  1209. "SELECT\n\tvariant<\n\t\ta: int32, b: string,\n\t\tc: double, d: bool,\n\t>\n;\n"},
  1210. };
  1211. TSetup setup;
  1212. setup.Run(cases);
  1213. }
  1214. Y_UNIT_TEST(MultiLineEnum) {
  1215. TCases cases = {
  1216. {"select enum<a\n>",
  1217. "SELECT\n\tenum<\n\t\ta\n\t>\n;\n"},
  1218. {"select enum<\na>",
  1219. "SELECT\n\tenum<\n\t\ta\n\t>\n;\n"},
  1220. {"select enum<a,\n>",
  1221. "SELECT\n\tenum<\n\t\ta,\n\t>\n;\n"},
  1222. {"select enum<a\n,>",
  1223. "SELECT\n\tenum<\n\t\ta,\n\t>\n;\n"},
  1224. {"select enum<\na,>",
  1225. "SELECT\n\tenum<\n\t\ta,\n\t>\n;\n"},
  1226. {"select enum<\na,b,\nc,d>",
  1227. "SELECT\n\tenum<\n\t\ta, b,\n\t\tc, d\n\t>\n;\n"},
  1228. {"select enum<\na,b,\nc,d,>",
  1229. "SELECT\n\tenum<\n\t\ta, b,\n\t\tc, d,\n\t>\n;\n"},
  1230. };
  1231. TSetup setup;
  1232. setup.Run(cases);
  1233. }
  1234. Y_UNIT_TEST(MultiLineResourceType) {
  1235. TCases cases = {
  1236. {"select resource<foo\n>",
  1237. "SELECT\n\tresource<\n\t\tfoo\n\t>\n;\n"},
  1238. {"select resource<\nfoo>",
  1239. "SELECT\n\tresource<\n\t\tfoo\n\t>\n;\n"},
  1240. };
  1241. TSetup setup;
  1242. setup.Run(cases);
  1243. }
  1244. Y_UNIT_TEST(MultiLineTaggedType) {
  1245. TCases cases = {
  1246. {"select tagged<int32,foo\n>",
  1247. "SELECT\n\ttagged<\n\t\tint32, foo\n\t>\n;\n"},
  1248. {"select tagged<int32,\nfoo>",
  1249. "SELECT\n\ttagged<\n\t\tint32,\n\t\tfoo\n\t>\n;\n"},
  1250. {"select tagged<int32\n,foo>",
  1251. "SELECT\n\ttagged<\n\t\tint32,\n\t\tfoo\n\t>\n;\n"},
  1252. {"select tagged<\nint32,foo>",
  1253. "SELECT\n\ttagged<\n\t\tint32, foo\n\t>\n;\n"},
  1254. };
  1255. TSetup setup;
  1256. setup.Run(cases);
  1257. }
  1258. Y_UNIT_TEST(MultiLineDictType) {
  1259. TCases cases = {
  1260. {"select dict<int32,string\n>",
  1261. "SELECT\n\tdict<\n\t\tint32, string\n\t>\n;\n"},
  1262. {"select dict<int32,\nstring>",
  1263. "SELECT\n\tdict<\n\t\tint32,\n\t\tstring\n\t>\n;\n"},
  1264. {"select dict<int32\n,string>",
  1265. "SELECT\n\tdict<\n\t\tint32,\n\t\tstring\n\t>\n;\n"},
  1266. {"select dict<\nint32,string>",
  1267. "SELECT\n\tdict<\n\t\tint32, string\n\t>\n;\n"},
  1268. };
  1269. TSetup setup;
  1270. setup.Run(cases);
  1271. }
  1272. Y_UNIT_TEST(MultiLineCallableType) {
  1273. TCases cases = {
  1274. {"select callable<()->int32\n>",
  1275. "SELECT\n\tcallable<\n\t\t() -> int32\n\t>\n;\n"},
  1276. {"select callable<\n()->int32>",
  1277. "SELECT\n\tcallable<\n\t\t() -> int32\n\t>\n;\n"},
  1278. {"select callable<\n(int32)->int32>",
  1279. "SELECT\n\tcallable<\n\t\t(int32) -> int32\n\t>\n;\n"},
  1280. {"select callable<\n(int32,\ndouble)->int32>",
  1281. "SELECT\n\tcallable<\n\t\t(\n\t\t\tint32,\n\t\t\tdouble\n\t\t) -> int32\n\t>\n;\n"},
  1282. {"select callable<\n(int32\n,double)->int32>",
  1283. "SELECT\n\tcallable<\n\t\t(\n\t\t\tint32,\n\t\t\tdouble\n\t\t) -> int32\n\t>\n;\n"},
  1284. };
  1285. TSetup setup;
  1286. setup.Run(cases);
  1287. }
  1288. Y_UNIT_TEST(UnaryOp) {
  1289. TCases cases = {
  1290. {"select -x,+x,~x,-1,-1.0,+1,+1.0,~1u",
  1291. "SELECT\n\t-x,\n\t+x,\n\t~x,\n\t-1,\n\t-1.0,\n\t+1,\n\t+1.0,\n\t~1u\n;\n"},
  1292. };
  1293. TSetup setup;
  1294. setup.Run(cases);
  1295. }
  1296. Y_UNIT_TEST(MatchRecognize) {
  1297. TCases cases = {{R"(
  1298. pragma FeatureR010="prototype";
  1299. USE plato;
  1300. SELECT
  1301. *
  1302. FROM Input MATCH_RECOGNIZE(
  1303. PARTITION BY a, b, c
  1304. ORDER BY ts
  1305. MEASURES LAST(B1.ts) AS b1, LAST(B3.ts) AS b3
  1306. ONE ROW PER MATCH AFTER MATCH SKIP TO NEXT ROW INITIAL
  1307. PATTERN ( A B2 + B3 )
  1308. SUBSET U = (C, D), W = (Q, P)
  1309. DEFINE A as A, B as B
  1310. );
  1311. )",
  1312. R"(PRAGMA FeatureR010 = 'prototype';
  1313. USE plato;
  1314. SELECT
  1315. *
  1316. FROM
  1317. Input MATCH_RECOGNIZE (
  1318. PARTITION BY
  1319. a,
  1320. b,
  1321. c
  1322. ORDER BY
  1323. ts
  1324. MEASURES
  1325. LAST(B1.ts) AS b1,
  1326. LAST(B3.ts) AS b3
  1327. ONE ROW PER MATCH
  1328. AFTER MATCH SKIP TO NEXT ROW
  1329. INITIAL PATTERN (A B2 + B3)
  1330. SUBSET
  1331. U = (C, D),
  1332. W = (Q, P)
  1333. DEFINE
  1334. A AS A,
  1335. B AS B
  1336. )
  1337. ;
  1338. )"
  1339. }};
  1340. TSetup setup;
  1341. setup.Run(cases);
  1342. }
  1343. Y_UNIT_TEST(CreateTableTrailingComma) {
  1344. TCases cases = {
  1345. {"CREATE TABLE tableName (Key Uint32, PRIMARY KEY (Key),);",
  1346. "CREATE TABLE tableName (\n\tKey Uint32,\n\tPRIMARY KEY (Key),\n);\n"},
  1347. {"CREATE TABLE tableName (Key Uint32,);",
  1348. "CREATE TABLE tableName (\n\tKey Uint32,\n);\n"},
  1349. };
  1350. TSetup setup;
  1351. setup.Run(cases);
  1352. }
  1353. Y_UNIT_TEST(Union) {
  1354. TCases cases = {
  1355. {"select 1 union all select 2 union select 3 union all select 4 union select 5",
  1356. "SELECT\n\t1\nUNION ALL\nSELECT\n\t2\nUNION\nSELECT\n\t3\nUNION ALL\nSELECT\n\t4\nUNION\nSELECT\n\t5\n;\n"},
  1357. {"select 1 union all (select 2)",
  1358. "SELECT\n\t1\nUNION ALL\n(\n\tSELECT\n\t\t2\n);\n"},
  1359. };
  1360. TSetup setup;
  1361. setup.Run(cases);
  1362. }
  1363. Y_UNIT_TEST(CommentAfterLastSelect) {
  1364. TCases cases = {
  1365. {"SELECT 1--comment\n",
  1366. "SELECT\n\t1 --comment\n;\n"},
  1367. {"SELECT 1\n\n--comment\n",
  1368. "SELECT\n\t1\n\n--comment\n;\n"},
  1369. {"SELECT 1\n\n--comment",
  1370. "SELECT\n\t1\n\n--comment\n;\n"},
  1371. {"SELECT * FROM Input /* comment */\n\n\n",
  1372. "SELECT\n\t*\nFROM\n\tInput /* comment */\n;\n"},
  1373. {"SELECT * FROM Input\n\n\n\n/* comment */\n\n\n",
  1374. "SELECT\n\t*\nFROM\n\tInput\n\n/* comment */;\n"},
  1375. };
  1376. TSetup setup;
  1377. setup.Run(cases);
  1378. }
  1379. Y_UNIT_TEST(WindowFunctionInsideExpr) {
  1380. TCases cases = {
  1381. {"SELECT CAST(ROW_NUMBER() OVER () AS String) AS x,\nFROM Input;",
  1382. "SELECT\n\tCAST(ROW_NUMBER() OVER () AS String) AS x,\nFROM\n\tInput\n;\n"},
  1383. {"SELECT CAST(ROW_NUMBER() OVER (PARTITION BY key) AS String) AS x,\nFROM Input;",
  1384. "SELECT\n\tCAST(\n\t\tROW_NUMBER() OVER (\n\t\t\tPARTITION BY\n\t\t\t\tkey\n\t\t) AS String\n\t) AS x,\nFROM\n\tInput\n;\n"},
  1385. {"SELECT CAST(ROW_NUMBER() OVER (users) AS String) AS x,\nFROM Input;",
  1386. "SELECT\n\tCAST(\n\t\tROW_NUMBER() OVER (\n\t\t\tusers\n\t\t) AS String\n\t) AS x,\nFROM\n\tInput\n;\n"},
  1387. };
  1388. TSetup setup;
  1389. setup.Run(cases);
  1390. }
  1391. Y_UNIT_TEST(ExistsExpr) {
  1392. TCases cases = {
  1393. {"SELECT EXISTS (SELECT 1);",
  1394. "SELECT\n\tEXISTS (\n\t\tSELECT\n\t\t\t1\n\t)\n;\n"},
  1395. {"SELECT CAST(EXISTS(SELECT 1) AS Int) AS x,\nFROM Input;",
  1396. "SELECT\n\tCAST(\n\t\tEXISTS (\n\t\t\tSELECT\n\t\t\t\t1\n\t\t) AS Int\n\t) AS x,\nFROM\n\tInput\n;\n"},
  1397. };
  1398. TSetup setup;
  1399. setup.Run(cases);
  1400. }
  1401. Y_UNIT_TEST(LambdaInsideExpr) {
  1402. TCases cases = {
  1403. {"SELECT ListMap(AsList(1,2),($x)->{return $x+1});",
  1404. "SELECT\n\tListMap(\n\t\tAsList(1, 2), ($x) -> {\n\t\t\tRETURN $x + 1;\n\t\t}\n\t)\n;\n"},
  1405. };
  1406. TSetup setup;
  1407. setup.Run(cases);
  1408. }
  1409. Y_UNIT_TEST(CaseExpr) {
  1410. TCases cases = {
  1411. {"SELECT CASE WHEN 1 == 2 THEN 3 WHEN 4 == 5 THEN 6 WHEN 7 == 8 THEN 9 ELSE 10 END;",
  1412. "SELECT\n\tCASE\n\t\tWHEN 1 == 2 THEN 3\n\t\tWHEN 4 == 5 THEN 6\n\t\tWHEN 7 == 8 THEN 9\n\t\tELSE 10\n\tEND\n;\n"},
  1413. {"SELECT CAST(CASE WHEN 1 == 2 THEN 3 WHEN 4 == 5 THEN 6 ELSE 10 END AS String);",
  1414. "SELECT\n\tCAST(\n\t\tCASE\n\t\t\tWHEN 1 == 2 THEN 3\n\t\t\tWHEN 4 == 5 THEN 6\n\t\t\tELSE 10\n\t\tEND AS String\n\t)\n;\n"},
  1415. {"SELECT CASE x WHEN 1 THEN 2 WHEN 3 THEN 4 WHEN 5 THEN 6 ELSE 10 END;",
  1416. "SELECT\n\tCASE x\n\t\tWHEN 1 THEN 2\n\t\tWHEN 3 THEN 4\n\t\tWHEN 5 THEN 6\n\t\tELSE 10\n\tEND\n;\n"},
  1417. };
  1418. TSetup setup;
  1419. setup.Run(cases);
  1420. }
  1421. Y_UNIT_TEST(MultiTokenOperations) {
  1422. TCases cases = {
  1423. {"$x = 1 >>| 2;",
  1424. "$x = 1 >>| 2;\n"},
  1425. {"$x = 1 >> 2;",
  1426. "$x = 1 >> 2;\n"},
  1427. {"$x = 1 ?? 2;",
  1428. "$x = 1 ?? 2;\n"},
  1429. {"$x = 1 > /*comment*/ > /*comment*/ | 2;",
  1430. "$x = 1 > /*comment*/> /*comment*/| 2;\n"},
  1431. };
  1432. TSetup setup;
  1433. setup.Run(cases);
  1434. }
  1435. Y_UNIT_TEST(OperatorNewlines) {
  1436. TCases cases = {
  1437. {"$x = TRUE\nOR\nFALSE;",
  1438. "$x = TRUE\n\tOR\n\tFALSE;\n"},
  1439. {"$x = TRUE OR\nFALSE;",
  1440. "$x = TRUE\n\tOR FALSE;\n"},
  1441. {"$x = TRUE\nOR FALSE;",
  1442. "$x = TRUE\n\tOR FALSE;\n"},
  1443. {"$x = 1+\n2*\n3;",
  1444. "$x = 1\n\t+ 2\n\t* 3;\n"},
  1445. {"$x = 1\n+\n2\n*3\n*5\n+\n4;",
  1446. "$x = 1\n\t+\n\t2\n\t* 3\n\t* 5\n\t+\n\t4;\n"},
  1447. {"$x = 1\n+2+3+4\n+5+6+7+\n\n8+9+10;",
  1448. "$x = 1\n\t+ 2 + 3 + 4\n\t+ 5 + 6 + 7\n\t+ 8 + 9 + 10;\n"},
  1449. {"$x = TRUE\nAND\nTRUE OR\nFALSE\nAND TRUE\nOR FALSE\nAND TRUE\nOR FALSE;",
  1450. "$x = TRUE\n\tAND\n\tTRUE\n\tOR FALSE\n\tAND TRUE\n\tOR FALSE\n\tAND TRUE\n\tOR FALSE;\n"},
  1451. {"$x = 1 -- comment\n+ 2;",
  1452. "$x = 1 -- comment\n\t+ 2;\n"},
  1453. {"$x = 1 -- comment\n+ -- comment\n2;",
  1454. "$x = 1 -- comment\n\t+ -- comment\n\t2;\n"},
  1455. {"$x = 1 + -- comment\n2;",
  1456. "$x = 1\n\t+ -- comment\n\t2;\n"},
  1457. {"$x = 1\n>\n>\n|\n2;",
  1458. "$x = 1\n\t>>|\n\t2;\n"},
  1459. {"$x = 1\n?? 2 ??\n3\n??\n4 +\n5\n*\n6 +\n7 ??\n8;",
  1460. "$x = 1 ??\n\t2 ??\n\t3\n\t??\n\t4\n\t+ 5\n\t*\n\t6\n\t+ 7 ??\n\t8;\n"},
  1461. };
  1462. TSetup setup;
  1463. setup.Run(cases);
  1464. }
  1465. Y_UNIT_TEST(ObfuscateSelect) {
  1466. TCases cases = {
  1467. {"select 1;",
  1468. "SELECT\n\t0\n;\n"},
  1469. {"select true;",
  1470. "SELECT\n\tFALSE\n;\n"},
  1471. {"select 'foo';",
  1472. "SELECT\n\t'str'\n;\n"},
  1473. {"select 3.0;",
  1474. "SELECT\n\t0.0\n;\n"},
  1475. {"select col;",
  1476. "SELECT\n\tid\n;\n"},
  1477. {"select * from tab;",
  1478. "SELECT\n\t*\nFROM\n\tid\n;\n"},
  1479. {"select cast(col as int32);",
  1480. "SELECT\n\tCAST(id AS int32)\n;\n"},
  1481. {"select func(col);",
  1482. "SELECT\n\tfunc(id)\n;\n"},
  1483. {"select mod::func(col);",
  1484. "SELECT\n\tmod::func(id)\n;\n"},
  1485. {"declare $a as int32;",
  1486. "DECLARE $id AS int32;\n"},
  1487. {"select * from `logs/of/bob` where pwd='foo';",
  1488. "SELECT\n\t*\nFROM\n\tid\nWHERE\n\tid == 'str'\n;\n"},
  1489. {"select $f();",
  1490. "SELECT\n\t$id()\n;\n"},
  1491. };
  1492. TSetup setup;
  1493. setup.Run(cases, NSQLFormat::EFormatMode::Obfuscate);
  1494. }
  1495. Y_UNIT_TEST(ObfuscatePragma) {
  1496. TCases cases = {
  1497. {"pragma a=1",
  1498. "PRAGMA id = 0;\n"},
  1499. {"pragma a='foo';",
  1500. "PRAGMA id = 'str';\n"},
  1501. {"pragma a=true;",
  1502. "PRAGMA id = FALSE;\n"},
  1503. {"pragma a=$foo;",
  1504. "PRAGMA id = $id;\n"},
  1505. {"pragma a=foo;",
  1506. "PRAGMA id = id;\n"},
  1507. };
  1508. TSetup setup;
  1509. setup.Run(cases, NSQLFormat::EFormatMode::Obfuscate);
  1510. }
  1511. Y_UNIT_TEST(CreateView) {
  1512. TCases cases = {{
  1513. "creAte vIEw TheView As SELect 1",
  1514. "CREATE VIEW TheView AS\nSELECT\n\t1\n;\n"
  1515. }, {
  1516. "creAte vIEw If Not ExIsTs TheView As SELect 1",
  1517. "CREATE VIEW IF NOT EXISTS TheView AS\nSELECT\n\t1\n;\n"
  1518. }, {
  1519. "creAte vIEw TheView wiTh (option = tRuE) As SELect 1",
  1520. "CREATE VIEW TheView WITH (option = TRUE) AS\nSELECT\n\t1\n;\n"
  1521. }
  1522. };
  1523. TSetup setup;
  1524. setup.Run(cases);
  1525. }
  1526. Y_UNIT_TEST(DropView) {
  1527. TCases cases = {{
  1528. "dRop viEW theVIEW",
  1529. "DROP VIEW theVIEW;\n"
  1530. }, {
  1531. "dRop viEW iF EXistS theVIEW",
  1532. "DROP VIEW IF EXISTS theVIEW;\n"
  1533. }
  1534. };
  1535. TSetup setup;
  1536. setup.Run(cases);
  1537. }
  1538. Y_UNIT_TEST(ResourcePoolOperations) {
  1539. TCases cases = {
  1540. {"creAte reSourCe poOl naMe With (a = \"b\")",
  1541. "CREATE RESOURCE POOL naMe WITH (a = 'b');\n"},
  1542. {"create resource pool eds with (a=\"a\",b=\"b\",c = true)",
  1543. "CREATE RESOURCE POOL eds WITH (\n\ta = 'a',\n\tb = 'b',\n\tc = TRUE\n);\n"},
  1544. {"alTer reSOurcE poOl naMe resEt (b, c), seT (x=y, z=false)",
  1545. "ALTER RESOURCE POOL naMe\n\tRESET (b, c),\n\tSET (x = y, z = FALSE)\n;\n"},
  1546. {"alter resource pool eds reset (a), set (x=y)",
  1547. "ALTER RESOURCE POOL eds\n\tRESET (a),\n\tSET (x = y)\n;\n"},
  1548. {"dRop reSourCe poOl naMe",
  1549. "DROP RESOURCE POOL naMe;\n"},
  1550. };
  1551. TSetup setup;
  1552. setup.Run(cases);
  1553. }
  1554. Y_UNIT_TEST(BackupCollectionOperations) {
  1555. TCases cases = {
  1556. {"creAte BackuP colLection `-naMe` wIth (a = \"b\")",
  1557. "CREATE BACKUP COLLECTION `-naMe` WITH (a = 'b');\n"},
  1558. {"creAte BackuP colLection `-naMe` DATabase wIth (a = 'b')",
  1559. "CREATE BACKUP COLLECTION `-naMe` DATABASE WITH (a = 'b');\n"},
  1560. {"creAte BackuP colLection `-naMe` ( tabLe `tbl1` , TablE `tbl2`) wIth (a = \"b\")",
  1561. "CREATE BACKUP COLLECTION `-naMe` (TABLE `tbl1`, TABLE `tbl2`) WITH (a = 'b');\n"},
  1562. {"alTer bACKuP coLLECTION naMe resEt (b, c), seT (x=y, z=false)",
  1563. "ALTER BACKUP COLLECTION naMe\n\tRESET (b, c),\n\tSET (x = y, z = FALSE)\n;\n"},
  1564. {"alTer bACKuP coLLECTION naMe aDD DATAbase",
  1565. "ALTER BACKUP COLLECTION naMe\n\tADD DATABASE\n;\n"},
  1566. {"alTer bACKuP coLLECTION naMe DRoP \n\n DaTAbase",
  1567. "ALTER BACKUP COLLECTION naMe\n\tDROP DATABASE\n;\n"},
  1568. {"alTer bACKuP coLLECTION naMe add \n\n tablE\n\tsometable,drOp TABle `other`",
  1569. "ALTER BACKUP COLLECTION naMe\n\tADD TABLE sometable,\n\tDROP TABLE `other`\n;\n"},
  1570. {"DROP backup collectiOn `/some/path`",
  1571. "DROP BACKUP COLLECTION `/some/path`;\n"},
  1572. };
  1573. TSetup setup;
  1574. setup.Run(cases);
  1575. }
  1576. Y_UNIT_TEST(Analyze) {
  1577. TCases cases = {
  1578. {"analyze table (col1, col2, col3)",
  1579. "ANALYZE table (col1, col2, col3);\n"},
  1580. {"analyze table",
  1581. "ANALYZE table;\n"}
  1582. };
  1583. TSetup setup;
  1584. setup.Run(cases);
  1585. }
  1586. Y_UNIT_TEST(ResourcePoolClassifierOperations) {
  1587. TCases cases = {
  1588. {"creAte reSourCe poOl ClaSsiFIer naMe With (a = \"b\")",
  1589. "CREATE RESOURCE POOL CLASSIFIER naMe WITH (a = 'b');\n"},
  1590. {"create resource pool classifier eds with (a=\"a\",b=\"b\",c = true)",
  1591. "CREATE RESOURCE POOL CLASSIFIER eds WITH (\n\ta = 'a',\n\tb = 'b',\n\tc = TRUE\n);\n"},
  1592. {"alTer reSOurcE poOl ClaSsiFIer naMe resEt (b, c), seT (x=y, z=false)",
  1593. "ALTER RESOURCE POOL CLASSIFIER naMe\n\tRESET (b, c),\n\tSET (x = y, z = FALSE)\n;\n"},
  1594. {"alter resource pool classifier eds reset (a), set (x=y)",
  1595. "ALTER RESOURCE POOL CLASSIFIER eds\n\tRESET (a),\n\tSET (x = y)\n;\n"},
  1596. {"dRop reSourCe poOl ClaSsiFIer naMe",
  1597. "DROP RESOURCE POOL CLASSIFIER naMe;\n"},
  1598. };
  1599. TSetup setup;
  1600. setup.Run(cases);
  1601. }
  1602. Y_UNIT_TEST(Backup) {
  1603. TCases cases = {
  1604. {"\tBaCKup\n\n TestCollection incremENTAl",
  1605. "BACKUP TestCollection INCREMENTAL;\n"},
  1606. };
  1607. TSetup setup;
  1608. setup.Run(cases);
  1609. }
  1610. Y_UNIT_TEST(Restore) {
  1611. TCases cases = {
  1612. {"resToRe\n\n\n TestCollection aT\n \t \n '2024-06-16_20-14-02'",
  1613. "RESTORE TestCollection AT '2024-06-16_20-14-02';\n"},
  1614. };
  1615. TSetup setup;
  1616. setup.Run(cases);
  1617. }
  1618. Y_UNIT_TEST(AnsiLexer) {
  1619. TCases cases = {
  1620. {"select 'a', \"a\" from (select 1 as \"a\")",
  1621. "SELECT\n\t'a',\n\t\"a\"\nFROM (\n\tSELECT\n\t\t1 AS \"a\"\n);\n"},
  1622. };
  1623. TSetup setup(/* ansiLexer = */ true);
  1624. setup.Run(cases);
  1625. }