case.err 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. <sql-statement>
  2. --
  3. -- CASE
  4. -- Test the case statement
  5. --
  6. CREATE TABLE CASE_TBL (
  7. i integer,
  8. f double precision
  9. );
  10. </sql-statement>
  11. <sql-statement>
  12. CREATE TABLE CASE2_TBL (
  13. i integer,
  14. j integer
  15. );
  16. </sql-statement>
  17. <sql-statement>
  18. INSERT INTO CASE_TBL VALUES (1, 10.1);
  19. </sql-statement>
  20. <sql-statement>
  21. INSERT INTO CASE_TBL VALUES (2, 20.2);
  22. </sql-statement>
  23. <sql-statement>
  24. INSERT INTO CASE_TBL VALUES (3, -30.3);
  25. </sql-statement>
  26. <sql-statement>
  27. INSERT INTO CASE_TBL VALUES (4, NULL);
  28. </sql-statement>
  29. <sql-statement>
  30. INSERT INTO CASE2_TBL VALUES (1, -1);
  31. </sql-statement>
  32. <sql-statement>
  33. INSERT INTO CASE2_TBL VALUES (2, -2);
  34. </sql-statement>
  35. <sql-statement>
  36. INSERT INTO CASE2_TBL VALUES (3, -3);
  37. </sql-statement>
  38. <sql-statement>
  39. INSERT INTO CASE2_TBL VALUES (2, -4);
  40. </sql-statement>
  41. <sql-statement>
  42. INSERT INTO CASE2_TBL VALUES (1, NULL);
  43. </sql-statement>
  44. <sql-statement>
  45. INSERT INTO CASE2_TBL VALUES (NULL, -6);
  46. </sql-statement>
  47. <sql-statement>
  48. --
  49. -- Simplest examples without tables
  50. --
  51. SELECT '3' AS "One",
  52. CASE
  53. WHEN 1 < 2 THEN 3
  54. END AS "Simple WHEN";
  55. </sql-statement>
  56. <sql-statement>
  57. SELECT '<NULL>' AS "One",
  58. CASE
  59. WHEN 1 > 2 THEN 3
  60. END AS "Simple default";
  61. </sql-statement>
  62. <sql-statement>
  63. SELECT '3' AS "One",
  64. CASE
  65. WHEN 1 < 2 THEN 3
  66. ELSE 4
  67. END AS "Simple ELSE";
  68. </sql-statement>
  69. <sql-statement>
  70. SELECT '4' AS "One",
  71. CASE
  72. WHEN 1 > 2 THEN 3
  73. ELSE 4
  74. END AS "ELSE default";
  75. </sql-statement>
  76. <sql-statement>
  77. SELECT '6' AS "One",
  78. CASE
  79. WHEN 1 > 2 THEN 3
  80. WHEN 4 < 5 THEN 6
  81. ELSE 7
  82. END AS "Two WHEN with default";
  83. </sql-statement>
  84. <sql-statement>
  85. SELECT '7' AS "None",
  86. CASE WHEN random() < 0 THEN 1
  87. END AS "NULL on no matches";
  88. </sql-statement>
  89. <sql-statement>
  90. -- Constant-expression folding shouldn't evaluate unreachable subexpressions
  91. SELECT CASE WHEN 1=0 THEN 1/0 WHEN 1=1 THEN 1 ELSE 2/0 END;
  92. </sql-statement>
  93. <sql-statement>
  94. SELECT CASE 1 WHEN 0 THEN 1/0 WHEN 1 THEN 1 ELSE 2/0 END;
  95. </sql-statement>
  96. <sql-statement>
  97. -- However we do not currently suppress folding of potentially
  98. -- reachable subexpressions
  99. SELECT CASE WHEN i > 100 THEN 1/0 ELSE 0 END FROM case_tbl;
  100. </sql-statement>
  101. -stdin-:<main>: Fatal: Table metadata loading
  102. -stdin-:<main>: Fatal: ydb/library/yql/providers/yt/gateway/file/yql_yt_file_services.cpp:44: Table not found: plato.case_tbl
  103. <sql-statement>
  104. -- Test for cases involving untyped literals in test expression
  105. SELECT CASE 'a' WHEN 'a' THEN 1 ELSE 2 END;
  106. </sql-statement>
  107. <sql-statement>
  108. --
  109. -- Examples of targets involving tables
  110. --
  111. SELECT
  112. CASE
  113. WHEN i >= 3 THEN i
  114. END AS ">= 3 or Null"
  115. FROM CASE_TBL;
  116. </sql-statement>
  117. <sql-statement>
  118. SELECT
  119. CASE WHEN i >= 3 THEN (i + i)
  120. ELSE i
  121. END AS "Simplest Math"
  122. FROM CASE_TBL;
  123. </sql-statement>
  124. <sql-statement>
  125. SELECT i AS "Value",
  126. CASE WHEN (i < 0) THEN 'small'
  127. WHEN (i = 0) THEN 'zero'
  128. WHEN (i = 1) THEN 'one'
  129. WHEN (i = 2) THEN 'two'
  130. ELSE 'big'
  131. END AS "Category"
  132. FROM CASE_TBL;
  133. </sql-statement>
  134. <sql-statement>
  135. SELECT
  136. CASE WHEN ((i < 0) or (i < 0)) THEN 'small'
  137. WHEN ((i = 0) or (i = 0)) THEN 'zero'
  138. WHEN ((i = 1) or (i = 1)) THEN 'one'
  139. WHEN ((i = 2) or (i = 2)) THEN 'two'
  140. ELSE 'big'
  141. END AS "Category"
  142. FROM CASE_TBL;
  143. </sql-statement>
  144. <sql-statement>
  145. --
  146. -- Examples of qualifications involving tables
  147. --
  148. --
  149. -- NULLIF() and COALESCE()
  150. -- Shorthand forms for typical CASE constructs
  151. -- defined in the SQL standard.
  152. --
  153. SELECT * FROM CASE_TBL WHERE COALESCE(f,i) = 4;
  154. </sql-statement>
  155. <sql-statement>
  156. SELECT * FROM CASE_TBL WHERE NULLIF(f,i) = 2;
  157. </sql-statement>
  158. <sql-statement>
  159. SELECT COALESCE(a.f, b.i, b.j)
  160. FROM CASE_TBL a, CASE2_TBL b;
  161. </sql-statement>
  162. <sql-statement>
  163. SELECT *
  164. FROM CASE_TBL a, CASE2_TBL b
  165. WHERE COALESCE(a.f, b.i, b.j) = 2;
  166. </sql-statement>
  167. -stdin-:<main>: Error: Type annotation
  168. -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem
  169. SELECT *
  170. ^
  171. -stdin-:<main>:1:1: Error: Duplicated member: i
  172. SELECT *
  173. ^
  174. <sql-statement>
  175. SELECT NULLIF(a.i,b.i) AS "NULLIF(a.i,b.i)",
  176. NULLIF(b.i, 4) AS "NULLIF(b.i,4)"
  177. FROM CASE_TBL a, CASE2_TBL b;
  178. </sql-statement>
  179. <sql-statement>
  180. SELECT *
  181. FROM CASE_TBL a, CASE2_TBL b
  182. WHERE COALESCE(f,b.i) = 2;
  183. </sql-statement>
  184. -stdin-:<main>: Error: Type annotation
  185. -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem
  186. SELECT *
  187. ^
  188. -stdin-:<main>:1:1: Error: Duplicated member: i
  189. SELECT *
  190. ^
  191. <sql-statement>
  192. -- Tests for constant subexpression simplification
  193. explain (costs off)
  194. SELECT * FROM CASE_TBL WHERE NULLIF(1, 2) = 2;
  195. </sql-statement>
  196. -stdin-:<main>: Error: Parse Sql
  197. -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276
  198. -- Tests for constant subexpression simplification
  199. ^
  200. <sql-statement>
  201. explain (costs off)
  202. SELECT * FROM CASE_TBL WHERE NULLIF(1, 1) IS NOT NULL;
  203. </sql-statement>
  204. -stdin-:<main>: Error: Parse Sql
  205. -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276
  206. explain (costs off)
  207. ^
  208. <sql-statement>
  209. explain (costs off)
  210. SELECT * FROM CASE_TBL WHERE NULLIF(1, null) = 2;
  211. </sql-statement>
  212. -stdin-:<main>: Error: Parse Sql
  213. -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 276
  214. explain (costs off)
  215. ^
  216. <sql-statement>
  217. --
  218. -- Examples of updates involving tables
  219. --
  220. UPDATE CASE_TBL
  221. SET i = CASE WHEN i >= 3 THEN (- i)
  222. ELSE (2 * i) END;
  223. </sql-statement>
  224. -stdin-:<main>: Fatal: Pre type annotation
  225. -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys', 'mutationid'.
  226. <sql-statement>
  227. SELECT * FROM CASE_TBL;
  228. </sql-statement>
  229. <sql-statement>
  230. UPDATE CASE_TBL
  231. SET i = CASE WHEN i >= 2 THEN (2 * i)
  232. ELSE (3 * i) END;
  233. </sql-statement>
  234. -stdin-:<main>: Fatal: Pre type annotation
  235. -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys', 'mutationid'.
  236. <sql-statement>
  237. SELECT * FROM CASE_TBL;
  238. </sql-statement>
  239. <sql-statement>
  240. UPDATE CASE_TBL
  241. SET i = CASE WHEN b.i >= 2 THEN (2 * j)
  242. ELSE (3 * j) END
  243. FROM CASE2_TBL b
  244. WHERE j = -CASE_TBL.i;
  245. </sql-statement>
  246. -stdin-:<main>: Fatal: Pre type annotation
  247. -stdin-:<main>: Fatal: tools/enum_parser/enum_serialization_runtime/enum_runtime.cpp:70: Key 'pg_update' not found in enum NYql::EYtSettingType. Valid options are: 'initial', 'infer_scheme', 'force_infer_schema', 'do_not_fail_on_invalid_schema', 'direct_read', 'view', 'mode', 'scheme', 'weak_concat', 'anonymous', 'with_qb', 'inline', 'sample', 'joinLabel', 'ignore_non_existing', 'warn_non_existing', 'xlock', 'unordered', 'nonUnique', 'userschema', 'usercolumns', 'statcolumns', 'syscolumns', 'ignoretypev3', 'memUsage', 'itemsCount', 'rowFactor', 'ordered', 'keyFilter', 'keyFilter2', 'take', 'skip', 'limit', 'sortLimitBy', 'sortBy', 'reduceBy', 'reduceFilterBy', 'forceTransform', 'weakFields', 'sharded', 'combineChunks', 'jobCount', 'joinReduce', 'firstAsPrimary', 'flow', 'keepSorted', 'keySwitch', 'uniqueBy', 'opHash', 'mapOutputType', 'reduceInputType', 'noDq', 'split', 'compression_codec', 'erasure_codec', 'expiration', 'replication_factor', 'user_attrs', 'media', 'primary_medium', 'keep_meta', 'monotonic_keys', 'mutationid'.
  248. <sql-statement>
  249. SELECT * FROM CASE_TBL;
  250. </sql-statement>
  251. <sql-statement>
  252. --
  253. -- Nested CASE expressions
  254. --
  255. -- This test exercises a bug caused by aliasing econtext->caseValue_isNull
  256. -- with the isNull argument of the inner CASE's CaseExpr evaluation. After
  257. -- evaluating the vol(null) expression in the inner CASE's second WHEN-clause,
  258. -- the isNull flag for the case test value incorrectly became true, causing
  259. -- the third WHEN-clause not to match. The volatile function calls are needed
  260. -- to prevent constant-folding in the planner, which would hide the bug.
  261. -- Wrap this in a single transaction so the transient '=' operator doesn't
  262. -- cause problems in concurrent sessions
  263. BEGIN;
  264. </sql-statement>
  265. <sql-statement>
  266. CREATE FUNCTION vol(text) returns text as
  267. 'begin return $1; end' language plpgsql volatile;
  268. </sql-statement>
  269. -stdin-:<main>: Error: Parse Sql
  270. -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261
  271. CREATE FUNCTION vol(text) returns text as
  272. ^
  273. <sql-statement>
  274. SELECT CASE
  275. (CASE vol('bar')
  276. WHEN 'foo' THEN 'it was foo!'
  277. WHEN vol(null) THEN 'null input'
  278. WHEN 'bar' THEN 'it was bar!' END
  279. )
  280. WHEN 'it was foo!' THEN 'foo recognized'
  281. WHEN 'it was bar!' THEN 'bar recognized'
  282. ELSE 'unrecognized' END;
  283. </sql-statement>
  284. -stdin-:<main>: Error: Type annotation
  285. -stdin-:<main>:1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem
  286. SELECT CASE
  287. ^
  288. -stdin-:<main>:1:8: Error: At function: If, At function: Or, At function: Coalesce, At function: FromPg, At function: PgOp
  289. SELECT CASE
  290. ^
  291. -stdin-:<main>:2:4: Error: At function: If, At function: Or
  292. (CASE vol('bar')
  293. ^
  294. -stdin-:<main>:2:4: Error: At function: Coalesce, At function: FromPg, At function: PgOp
  295. (CASE vol('bar')
  296. ^
  297. -stdin-:<main>:2:9: Error: At function: PgCall
  298. (CASE vol('bar')
  299. ^
  300. -stdin-:<main>:2:9: Error: No such proc: vol
  301. (CASE vol('bar')
  302. ^
  303. -stdin-:<main>:2:4: Error: At function: Coalesce, At function: FromPg, At function: PgOp
  304. (CASE vol('bar')
  305. ^
  306. -stdin-:<main>:4:10: Error: At function: PgCall
  307. WHEN vol(null) THEN 'null input'
  308. ^
  309. -stdin-:<main>:4:10: Error: No such proc: vol
  310. WHEN vol(null) THEN 'null input'
  311. ^
  312. <sql-statement>
  313. -- In this case, we can't inline the SQL function without confusing things.
  314. CREATE DOMAIN foodomain AS text;
  315. </sql-statement>
  316. -stdin-:<main>: Error: Parse Sql
  317. -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 272
  318. -- In this case, we can't inline the SQL function without confusing things.
  319. ^
  320. <sql-statement>
  321. CREATE FUNCTION volfoo(text) returns foodomain as
  322. 'begin return $1::foodomain; end' language plpgsql volatile;
  323. </sql-statement>
  324. -stdin-:<main>: Error: Parse Sql
  325. -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261
  326. CREATE FUNCTION volfoo(text) returns foodomain as
  327. ^
  328. <sql-statement>
  329. CREATE FUNCTION inline_eq(foodomain, foodomain) returns boolean as
  330. 'SELECT CASE $2::text WHEN $1::text THEN true ELSE false END' language sql;
  331. </sql-statement>
  332. -stdin-:<main>: Error: Parse Sql
  333. -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261
  334. CREATE FUNCTION inline_eq(foodomain, foodomain) returns boolean as
  335. ^
  336. <sql-statement>
  337. CREATE OPERATOR = (procedure = inline_eq,
  338. leftarg = foodomain, rightarg = foodomain);
  339. </sql-statement>
  340. -stdin-:<main>: Error: Parse Sql
  341. -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 255
  342. CREATE OPERATOR = (procedure = inline_eq,
  343. ^
  344. <sql-statement>
  345. SELECT CASE volfoo('bar') WHEN 'foo'::foodomain THEN 'is foo' ELSE 'is not foo' END;
  346. </sql-statement>
  347. -stdin-:<main>: Error: Parse Sql
  348. -stdin-:<main>:1:39: Error: Unknown type: foodomain
  349. SELECT CASE volfoo('bar') WHEN 'foo'::foodomain THEN 'is foo' ELSE 'is not foo' END;
  350. ^
  351. <sql-statement>
  352. ROLLBACK;
  353. </sql-statement>
  354. <sql-statement>
  355. -- Test multiple evaluation of a CASE arg that is a read/write object (#14472)
  356. -- Wrap this in a single transaction so the transient '=' operator doesn't
  357. -- cause problems in concurrent sessions
  358. BEGIN;
  359. </sql-statement>
  360. <sql-statement>
  361. CREATE DOMAIN arrdomain AS int[];
  362. </sql-statement>
  363. -stdin-:<main>: Error: Parse Sql
  364. -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 272
  365. CREATE DOMAIN arrdomain AS int[];
  366. ^
  367. <sql-statement>
  368. CREATE FUNCTION make_ad(int,int) returns arrdomain as
  369. 'declare x arrdomain;
  370. begin
  371. x := array[$1,$2];
  372. return x;
  373. end' language plpgsql volatile;
  374. </sql-statement>
  375. -stdin-:<main>: Error: Parse Sql
  376. -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261
  377. CREATE FUNCTION make_ad(int,int) returns arrdomain as
  378. ^
  379. <sql-statement>
  380. CREATE FUNCTION ad_eq(arrdomain, arrdomain) returns boolean as
  381. 'begin return array_eq($1, $2); end' language plpgsql;
  382. </sql-statement>
  383. -stdin-:<main>: Error: Parse Sql
  384. -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 261
  385. CREATE FUNCTION ad_eq(arrdomain, arrdomain) returns boolean as
  386. ^
  387. <sql-statement>
  388. CREATE OPERATOR = (procedure = ad_eq,
  389. leftarg = arrdomain, rightarg = arrdomain);
  390. </sql-statement>
  391. -stdin-:<main>: Error: Parse Sql
  392. -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 255
  393. CREATE OPERATOR = (procedure = ad_eq,
  394. ^
  395. <sql-statement>
  396. SELECT CASE make_ad(1,2)
  397. WHEN array[2,4]::arrdomain THEN 'wrong'
  398. WHEN array[2,5]::arrdomain THEN 'still wrong'
  399. WHEN array[1,2]::arrdomain THEN 'right'
  400. END;
  401. </sql-statement>
  402. -stdin-:<main>: Error: Parse Sql
  403. -stdin-:<main>:2:20: Error: Unknown type: arrdomain
  404. WHEN array[2,4]::arrdomain THEN 'wrong'
  405. ^
  406. <sql-statement>
  407. ROLLBACK;
  408. </sql-statement>
  409. <sql-statement>
  410. -- Test interaction of CASE with ArrayCoerceExpr (bug #15471)
  411. BEGIN;
  412. </sql-statement>
  413. <sql-statement>
  414. CREATE TYPE casetestenum AS ENUM ('e', 'f', 'g');
  415. </sql-statement>
  416. -stdin-:<main>: Error: Parse Sql
  417. -stdin-:<main>:1:1: Error: RawStmt: alternative is not implemented yet : 315
  418. CREATE TYPE casetestenum AS ENUM ('e', 'f', 'g');
  419. ^
  420. <sql-statement>
  421. SELECT
  422. CASE 'foo'::text
  423. WHEN 'foo' THEN ARRAY['a', 'b', 'c', 'd'] || enum_range(NULL::casetestenum)::text[]
  424. ELSE ARRAY['x', 'y']
  425. END;
  426. </sql-statement>
  427. -stdin-:<main>: Error: Parse Sql
  428. -stdin-:<main>:3:67: Error: Unknown type: casetestenum
  429. WHEN 'foo' THEN ARRAY['a', 'b', 'c', 'd'] || enum_range(NULL::casetestenum)::text[]
  430. ^
  431. <sql-statement>
  432. ROLLBACK;
  433. </sql-statement>
  434. <sql-statement>
  435. --
  436. -- Clean up
  437. --
  438. DROP TABLE CASE_TBL;
  439. </sql-statement>
  440. <sql-statement>
  441. DROP TABLE CASE2_TBL;
  442. </sql-statement>