case.out 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. --
  2. -- CASE
  3. -- Test the case statement
  4. --
  5. CREATE TABLE CASE_TBL (
  6. i integer,
  7. f double precision
  8. );
  9. CREATE TABLE CASE2_TBL (
  10. i integer,
  11. j integer
  12. );
  13. INSERT INTO CASE_TBL VALUES (1, 10.1);
  14. INSERT INTO CASE_TBL VALUES (2, 20.2);
  15. INSERT INTO CASE_TBL VALUES (3, -30.3);
  16. INSERT INTO CASE_TBL VALUES (4, NULL);
  17. INSERT INTO CASE2_TBL VALUES (1, -1);
  18. INSERT INTO CASE2_TBL VALUES (2, -2);
  19. INSERT INTO CASE2_TBL VALUES (3, -3);
  20. INSERT INTO CASE2_TBL VALUES (2, -4);
  21. INSERT INTO CASE2_TBL VALUES (1, NULL);
  22. INSERT INTO CASE2_TBL VALUES (NULL, -6);
  23. --
  24. -- Simplest examples without tables
  25. --
  26. SELECT '3' AS "One",
  27. CASE
  28. WHEN 1 < 2 THEN 3
  29. END AS "Simple WHEN";
  30. One | Simple WHEN
  31. -----+-------------
  32. 3 | 3
  33. (1 row)
  34. SELECT '<NULL>' AS "One",
  35. CASE
  36. WHEN 1 > 2 THEN 3
  37. END AS "Simple default";
  38. One | Simple default
  39. --------+----------------
  40. <NULL> |
  41. (1 row)
  42. SELECT '3' AS "One",
  43. CASE
  44. WHEN 1 < 2 THEN 3
  45. ELSE 4
  46. END AS "Simple ELSE";
  47. One | Simple ELSE
  48. -----+-------------
  49. 3 | 3
  50. (1 row)
  51. SELECT '4' AS "One",
  52. CASE
  53. WHEN 1 > 2 THEN 3
  54. ELSE 4
  55. END AS "ELSE default";
  56. One | ELSE default
  57. -----+--------------
  58. 4 | 4
  59. (1 row)
  60. SELECT '6' AS "One",
  61. CASE
  62. WHEN 1 > 2 THEN 3
  63. WHEN 4 < 5 THEN 6
  64. ELSE 7
  65. END AS "Two WHEN with default";
  66. One | Two WHEN with default
  67. -----+-----------------------
  68. 6 | 6
  69. (1 row)
  70. SELECT '7' AS "None",
  71. CASE WHEN random() < 0 THEN 1
  72. END AS "NULL on no matches";
  73. None | NULL on no matches
  74. ------+--------------------
  75. 7 |
  76. (1 row)
  77. -- Constant-expression folding shouldn't evaluate unreachable subexpressions
  78. SELECT CASE WHEN 1=0 THEN 1/0 WHEN 1=1 THEN 1 ELSE 2/0 END;
  79. case
  80. ------
  81. 1
  82. (1 row)
  83. SELECT CASE 1 WHEN 0 THEN 1/0 WHEN 1 THEN 1 ELSE 2/0 END;
  84. case
  85. ------
  86. 1
  87. (1 row)
  88. -- Test for cases involving untyped literals in test expression
  89. SELECT CASE 'a' WHEN 'a' THEN 1 ELSE 2 END;
  90. case
  91. ------
  92. 1
  93. (1 row)
  94. --
  95. -- Examples of targets involving tables
  96. --
  97. SELECT
  98. CASE
  99. WHEN i >= 3 THEN i
  100. END AS ">= 3 or Null"
  101. FROM CASE_TBL;
  102. >= 3 or Null
  103. --------------
  104. 3
  105. 4
  106. (4 rows)
  107. SELECT
  108. CASE WHEN i >= 3 THEN (i + i)
  109. ELSE i
  110. END AS "Simplest Math"
  111. FROM CASE_TBL;
  112. Simplest Math
  113. ---------------
  114. 1
  115. 2
  116. 6
  117. 8
  118. (4 rows)
  119. SELECT i AS "Value",
  120. CASE WHEN (i < 0) THEN 'small'
  121. WHEN (i = 0) THEN 'zero'
  122. WHEN (i = 1) THEN 'one'
  123. WHEN (i = 2) THEN 'two'
  124. ELSE 'big'
  125. END AS "Category"
  126. FROM CASE_TBL;
  127. Value | Category
  128. -------+----------
  129. 1 | one
  130. 2 | two
  131. 3 | big
  132. 4 | big
  133. (4 rows)
  134. SELECT
  135. CASE WHEN ((i < 0) or (i < 0)) THEN 'small'
  136. WHEN ((i = 0) or (i = 0)) THEN 'zero'
  137. WHEN ((i = 1) or (i = 1)) THEN 'one'
  138. WHEN ((i = 2) or (i = 2)) THEN 'two'
  139. ELSE 'big'
  140. END AS "Category"
  141. FROM CASE_TBL;
  142. Category
  143. ----------
  144. one
  145. two
  146. big
  147. big
  148. (4 rows)
  149. --
  150. -- Examples of qualifications involving tables
  151. --
  152. --
  153. -- NULLIF() and COALESCE()
  154. -- Shorthand forms for typical CASE constructs
  155. -- defined in the SQL standard.
  156. --
  157. SELECT * FROM CASE_TBL WHERE COALESCE(f,i) = 4;
  158. i | f
  159. ---+---
  160. 4 |
  161. (1 row)
  162. SELECT * FROM CASE_TBL WHERE NULLIF(f,i) = 2;
  163. i | f
  164. ---+---
  165. (0 rows)
  166. SELECT COALESCE(a.f, b.i, b.j)
  167. FROM CASE_TBL a, CASE2_TBL b;
  168. coalesce
  169. ----------
  170. 10.1
  171. 20.2
  172. -30.3
  173. 1
  174. 10.1
  175. 20.2
  176. -30.3
  177. 2
  178. 10.1
  179. 20.2
  180. -30.3
  181. 3
  182. 10.1
  183. 20.2
  184. -30.3
  185. 2
  186. 10.1
  187. 20.2
  188. -30.3
  189. 1
  190. 10.1
  191. 20.2
  192. -30.3
  193. -6
  194. (24 rows)
  195. SELECT NULLIF(a.i,b.i) AS "NULLIF(a.i,b.i)",
  196. NULLIF(b.i, 4) AS "NULLIF(b.i,4)"
  197. FROM CASE_TBL a, CASE2_TBL b;
  198. NULLIF(a.i,b.i) | NULLIF(b.i,4)
  199. -----------------+---------------
  200. | 1
  201. 2 | 1
  202. 3 | 1
  203. 4 | 1
  204. 1 | 2
  205. | 2
  206. 3 | 2
  207. 4 | 2
  208. 1 | 3
  209. 2 | 3
  210. | 3
  211. 4 | 3
  212. 1 | 2
  213. | 2
  214. 3 | 2
  215. 4 | 2
  216. | 1
  217. 2 | 1
  218. 3 | 1
  219. 4 | 1
  220. 1 |
  221. 2 |
  222. 3 |
  223. 4 |
  224. (24 rows)
  225. --
  226. -- Nested CASE expressions
  227. --
  228. -- This test exercises a bug caused by aliasing econtext->caseValue_isNull
  229. -- with the isNull argument of the inner CASE's CaseExpr evaluation. After
  230. -- evaluating the vol(null) expression in the inner CASE's second WHEN-clause,
  231. -- the isNull flag for the case test value incorrectly became true, causing
  232. -- the third WHEN-clause not to match. The volatile function calls are needed
  233. -- to prevent constant-folding in the planner, which would hide the bug.
  234. -- Wrap this in a single transaction so the transient '=' operator doesn't
  235. -- cause problems in concurrent sessions
  236. BEGIN;
  237. ROLLBACK;
  238. -- Test multiple evaluation of a CASE arg that is a read/write object (#14472)
  239. -- Wrap this in a single transaction so the transient '=' operator doesn't
  240. -- cause problems in concurrent sessions
  241. BEGIN;
  242. ROLLBACK;
  243. -- Test interaction of CASE with ArrayCoerceExpr (bug #15471)
  244. BEGIN;
  245. ROLLBACK;
  246. --
  247. -- Clean up
  248. --
  249. DROP TABLE CASE_TBL;
  250. DROP TABLE CASE2_TBL;