topk.slt 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. mode cockroach
  10. statement ok
  11. CREATE TABLE cities (
  12. name text NOT NULL,
  13. state text NOT NULL,
  14. pop int
  15. )
  16. statement ok
  17. INSERT INTO cities VALUES
  18. ('Los_Angeles', 'CA', 3979576),
  19. ('Phoenix', 'AZ', 1680992),
  20. ('Houston', 'TX', 2320268),
  21. ('San_Diego', 'CA', NULL),
  22. ('San_Francisco', 'CA', 881549),
  23. ('New_York', 'NY', 8336817),
  24. ('Dallas', 'TX', 1343573),
  25. ('San_Antonio', 'TX', 1547253),
  26. ('San_Jose', 'CA', 1021795),
  27. ('Chicago', 'IL', 2695598),
  28. ('Austin', 'TX', 978908)
  29. query TT rowsort
  30. SELECT state, name FROM
  31. (SELECT DISTINCT state FROM cities) grp,
  32. LATERAL (SELECT name FROM cities WHERE state = grp.state ORDER BY pop DESC NULLS LAST LIMIT 3)
  33. ----
  34. AZ Phoenix
  35. CA Los_Angeles
  36. CA San_Francisco
  37. CA San_Jose
  38. IL Chicago
  39. NY New_York
  40. TX Houston
  41. TX San_Antonio
  42. TX Dallas
  43. query TT rowsort
  44. SELECT state, name FROM
  45. (SELECT DISTINCT state FROM cities) grp,
  46. LATERAL (SELECT name FROM cities WHERE state = grp.state ORDER BY pop DESC NULLS FIRST LIMIT 3)
  47. ----
  48. AZ Phoenix
  49. CA San_Diego
  50. CA Los_Angeles
  51. CA San_Jose
  52. IL Chicago
  53. NY New_York
  54. TX Houston
  55. TX San_Antonio
  56. TX Dallas
  57. # LIMIT INPUT GROUP SIZE hint should not affect the results
  58. query TT rowsort
  59. SELECT state, name FROM
  60. (SELECT DISTINCT state FROM cities) grp,
  61. LATERAL (SELECT name FROM cities WHERE state = grp.state
  62. OPTIONS (LIMIT INPUT GROUP SIZE = 1)
  63. ORDER BY pop DESC NULLS LAST LIMIT 3)
  64. ----
  65. AZ Phoenix
  66. CA Los_Angeles
  67. CA San_Francisco
  68. CA San_Jose
  69. IL Chicago
  70. NY New_York
  71. TX Dallas
  72. TX Houston
  73. TX San_Antonio
  74. mode standard
  75. query T multiline
  76. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT state, name FROM
  77. (SELECT DISTINCT state FROM cities) grp,
  78. LATERAL (SELECT name, pop FROM cities WHERE state = grp.state ORDER BY pop DESC LIMIT 3)
  79. ----
  80. Explained Query:
  81. Project (#1{state}, #0{name}) // { arity: 2 }
  82. TopK group_by=[#1{state}] order_by=[#2{pop} desc nulls_first] limit=3 // { arity: 3 }
  83. ReadStorage materialize.public.cities // { arity: 3 }
  84. Source materialize.public.cities
  85. Target cluster: quickstart
  86. EOF
  87. query T multiline
  88. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT state, name FROM
  89. (SELECT DISTINCT state FROM cities) grp
  90. LEFT JOIN LATERAL (SELECT name, pop FROM cities where cities.state = grp.state ORDER BY pop DESC LIMIT 3) ON true
  91. ----
  92. Explained Query:
  93. With
  94. cte l0 =
  95. Project (#0{name}, #1{state}) // { arity: 2 }
  96. TopK group_by=[#1{state}] order_by=[#2{pop} desc nulls_first] limit=3 // { arity: 3 }
  97. ReadStorage materialize.public.cities // { arity: 3 }
  98. Return // { arity: 2 }
  99. Union // { arity: 2 }
  100. Project (#1{state}, #0{name}) // { arity: 2 }
  101. Get l0 // { arity: 2 }
  102. Map (null) // { arity: 2 }
  103. Union // { arity: 1 }
  104. Negate // { arity: 1 }
  105. Distinct project=[#0{state}] // { arity: 1 }
  106. Project (#1{state}) // { arity: 1 }
  107. Get l0 // { arity: 2 }
  108. Distinct project=[#0{state}] // { arity: 1 }
  109. Project (#1{state}) // { arity: 1 }
  110. ReadStorage materialize.public.cities // { arity: 3 }
  111. Source materialize.public.cities
  112. Target cluster: quickstart
  113. EOF
  114. # Test that LIMIT 0 is optimized out
  115. query T multiline
  116. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT state, COUNT(*) FROM (
  117. SELECT state, name FROM
  118. (SELECT DISTINCT state FROM cities) grp,
  119. LATERAL (SELECT name, pop FROM cities WHERE state = grp.state ORDER BY pop DESC LIMIT 0)
  120. )
  121. GROUP BY state
  122. ----
  123. Explained Query (fast path):
  124. Constant <empty>
  125. Target cluster: quickstart
  126. EOF
  127. # Test that LIMIT 1 results in a unique key
  128. query T multiline
  129. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT state, COUNT(*) FROM (
  130. SELECT state, name FROM
  131. (SELECT DISTINCT state FROM cities) grp,
  132. LATERAL (SELECT name, pop FROM cities WHERE state = grp.state ORDER BY pop DESC LIMIT 1)
  133. )
  134. GROUP BY state
  135. ----
  136. Explained Query:
  137. Project (#0{state}, #2) // { arity: 2 }
  138. Map (1) // { arity: 3 }
  139. TopK group_by=[#0{state}] order_by=[#1{pop} desc nulls_first] limit=1 // { arity: 2 }
  140. Project (#1{state}, #2{pop}) // { arity: 2 }
  141. ReadStorage materialize.public.cities // { arity: 3 }
  142. Source materialize.public.cities
  143. Target cluster: quickstart
  144. EOF
  145. query T multiline
  146. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT state, name FROM
  147. (SELECT DISTINCT state FROM cities) grp,
  148. LATERAL (SELECT name FROM cities WHERE state = grp.state
  149. OPTIONS (LIMIT INPUT GROUP SIZE = 1)
  150. ORDER BY pop DESC NULLS LAST LIMIT 3)
  151. ----
  152. Explained Query:
  153. Project (#1{state}, #0{name}) // { arity: 2 }
  154. TopK group_by=[#1{state}] order_by=[#2{pop} desc nulls_last] limit=3 exp_group_size=1 // { arity: 3 }
  155. ReadStorage materialize.public.cities // { arity: 3 }
  156. Source materialize.public.cities
  157. Target cluster: quickstart
  158. EOF