case.sql 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. SELECT '<NULL>' AS "One",
  31. CASE
  32. WHEN 1 > 2 THEN 3
  33. END AS "Simple default";
  34. SELECT '3' AS "One",
  35. CASE
  36. WHEN 1 < 2 THEN 3
  37. ELSE 4
  38. END AS "Simple ELSE";
  39. SELECT '4' AS "One",
  40. CASE
  41. WHEN 1 > 2 THEN 3
  42. ELSE 4
  43. END AS "ELSE default";
  44. SELECT '6' AS "One",
  45. CASE
  46. WHEN 1 > 2 THEN 3
  47. WHEN 4 < 5 THEN 6
  48. ELSE 7
  49. END AS "Two WHEN with default";
  50. SELECT '7' AS "None",
  51. CASE WHEN random() < 0 THEN 1
  52. END AS "NULL on no matches";
  53. -- Constant-expression folding shouldn't evaluate unreachable subexpressions
  54. SELECT CASE WHEN 1=0 THEN 1/0 WHEN 1=1 THEN 1 ELSE 2/0 END;
  55. SELECT CASE 1 WHEN 0 THEN 1/0 WHEN 1 THEN 1 ELSE 2/0 END;
  56. -- Test for cases involving untyped literals in test expression
  57. SELECT CASE 'a' WHEN 'a' THEN 1 ELSE 2 END;
  58. --
  59. -- Examples of targets involving tables
  60. --
  61. SELECT
  62. CASE
  63. WHEN i >= 3 THEN i
  64. END AS ">= 3 or Null"
  65. FROM CASE_TBL;
  66. SELECT
  67. CASE WHEN i >= 3 THEN (i + i)
  68. ELSE i
  69. END AS "Simplest Math"
  70. FROM CASE_TBL;
  71. SELECT i AS "Value",
  72. CASE WHEN (i < 0) THEN 'small'
  73. WHEN (i = 0) THEN 'zero'
  74. WHEN (i = 1) THEN 'one'
  75. WHEN (i = 2) THEN 'two'
  76. ELSE 'big'
  77. END AS "Category"
  78. FROM CASE_TBL;
  79. SELECT
  80. CASE WHEN ((i < 0) or (i < 0)) THEN 'small'
  81. WHEN ((i = 0) or (i = 0)) THEN 'zero'
  82. WHEN ((i = 1) or (i = 1)) THEN 'one'
  83. WHEN ((i = 2) or (i = 2)) THEN 'two'
  84. ELSE 'big'
  85. END AS "Category"
  86. FROM CASE_TBL;
  87. --
  88. -- Examples of qualifications involving tables
  89. --
  90. --
  91. -- NULLIF() and COALESCE()
  92. -- Shorthand forms for typical CASE constructs
  93. -- defined in the SQL standard.
  94. --
  95. SELECT * FROM CASE_TBL WHERE COALESCE(f,i) = 4;
  96. SELECT * FROM CASE_TBL WHERE NULLIF(f,i) = 2;
  97. SELECT COALESCE(a.f, b.i, b.j)
  98. FROM CASE_TBL a, CASE2_TBL b;
  99. SELECT NULLIF(a.i,b.i) AS "NULLIF(a.i,b.i)",
  100. NULLIF(b.i, 4) AS "NULLIF(b.i,4)"
  101. FROM CASE_TBL a, CASE2_TBL b;
  102. --
  103. -- Nested CASE expressions
  104. --
  105. -- This test exercises a bug caused by aliasing econtext->caseValue_isNull
  106. -- with the isNull argument of the inner CASE's CaseExpr evaluation. After
  107. -- evaluating the vol(null) expression in the inner CASE's second WHEN-clause,
  108. -- the isNull flag for the case test value incorrectly became true, causing
  109. -- the third WHEN-clause not to match. The volatile function calls are needed
  110. -- to prevent constant-folding in the planner, which would hide the bug.
  111. -- Wrap this in a single transaction so the transient '=' operator doesn't
  112. -- cause problems in concurrent sessions
  113. BEGIN;
  114. ROLLBACK;
  115. -- Test multiple evaluation of a CASE arg that is a read/write object (#14472)
  116. -- Wrap this in a single transaction so the transient '=' operator doesn't
  117. -- cause problems in concurrent sessions
  118. BEGIN;
  119. ROLLBACK;
  120. -- Test interaction of CASE with ArrayCoerceExpr (bug #15471)
  121. BEGIN;
  122. ROLLBACK;
  123. --
  124. -- Clean up
  125. --
  126. DROP TABLE CASE_TBL;
  127. DROP TABLE CASE2_TBL;