# LogicTest: 5node

# First, we set up two data tables:
#   - NumToSquare maps integers from 1 to 100 to their squares
#   - NumToStr maps integers from 1 to 100*100 to strings; this table is
#     split and distributed to all nodes.
statement ok
CREATE TABLE NumToSquare (x INT PRIMARY KEY, xsquared INT)

statement ok
INSERT INTO NumToSquare SELECT i, i*i FROM GENERATE_SERIES(1, 100) AS g(i)

statement ok
CREATE TABLE NumToStr (y INT PRIMARY KEY, str STRING)

# Split into five parts.
statement ok
ALTER TABLE NumToStr SPLIT AT SELECT (i * 100 * 100 / 5)::int FROM GENERATE_SERIES(1, 4) AS g(i)

# Relocate the five parts to the five nodes.
statement ok
ALTER TABLE NumToStr TESTING_RELOCATE
  SELECT ARRAY[i+1], (i * 100 * 100 / 5)::int FROM GENERATE_SERIES(0, 4) AS g(i)

statement ok
INSERT INTO NumToStr SELECT i, to_english(i) FROM GENERATE_SERIES(1, 100*100) AS g(i)

# Verify data placement.
query TTTI colnames
SHOW TESTING_RANGES FROM TABLE NumToSquare
----
Start Key  End Key  Replicas  Lease Holder
NULL       NULL     {1}       1

query TTTI colnames
SHOW TESTING_RANGES FROM TABLE NumToStr
----
Start Key  End Key  Replicas  Lease Holder
NULL       /2000    {1}       1
/2000      /4000    {2}       2
/4000      /6000    {3}       3
/6000      /8000    {4}       4
/8000      NULL     {5}       5

# Ready to roll!
statement ok
SET DISTSQL = ON


#
# -- Basic tests --
#

# Query with a restricted span.

# We hardcode the plan for the testcase that follows to make it easier to debug
# errors caused by changing planning logic.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT 5, 2+y, * FROM NumToStr WHERE y <= 10 ORDER BY str]
----
https://cockroachdb.github.io/distsqlplan/decode.html?eJyUkDFrwzAQhff-CnNrNESmXTR59ZIWN1vRoFpHMNg6c3eGluD_XiwNbQMuzSDQvaf33UNXSBTxFCYUcG9gwRuYmXoUId6k8qCNH-COBoY0L7rJ3kBPjOCuoIOOCA7O4X3EDkNEBgMRNQxjhs48TIE_m7RMSqKb22GKyK56cs61p7Op6nI5NNZU-dTgVwO06PdC0XBBcHY1_y_1Sqy3fZrHwy68vgfeocyUBH_h98jH1RvAeMHyq0IL9_jC1Oc1ZXzOuSxEFC2uLUObirUV_Bm2f4brm7BfH74CAAD__ydlozk=

query IIIT
SELECT 5, 2+y, * FROM NumToStr WHERE y <= 10 ORDER BY str
----
5 10  8 eight
5  7  5 five
5  6  4 four
5 11  9 nine
5  3  1 one
5 12 10 one-zero
5  9  7 seven
5  8  6 six
5  5  3 three
5  4  2 two


# Query which requires a full table scan.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT 5, 2 + y, * FROM NumToStr WHERE y % 1000 = 0 ORDER BY str]
----
https://cockroachdb.github.io/distsqlplan/decode.html?eJzUlMFqwzAMhu97iiAYbNSD2Em7zjDIadBLN7reRg5ZLEogjYLtwEbpu4_Eg66ldQrZJYdAbOnX9yMZ7aAihctsiwbkB3BgIIBBBAxiYDCFlEGtKUdjSLcpTrBQXyBDBkVVN7a9ThnkpBHkDmxhSwQJ6-yzxBVmCjUwUGizouwgtS62mf5OqmZrydg2-lKUFrUM7hIe3AY8DEMp5WK5vg-eg99fYLDCSrVZU3fDAuF-JglnQfcJSPcMqLEHW8ZmGwTJ9-x66--k7anrJJ5cLC4uFj_UJK1QozpX9IyDJT1QfZR7iR0dsfl4Z9JjfdhMxHj70mN9WF-i8falx_qwvsTj7UuP9f_bbWeKr9DUVBm8anOF7eJDtUG3KA01Osc3TXmHccfXTtddKDTWRbk7LCoXag3-FXOvWByJ-alY-Mk96Mirjv3ieIjvqVc885NnQ8iPXvHcT54PIT_5ZxX2PBP_Iztlp_ubnwAAAP__UGjpww==

query IIIT
SELECT 5, 2 + y, * FROM NumToStr WHERE y % 1000 = 0 ORDER BY str
----
5  8002  8000 eight-zero-zero-zero
5  5002  5000 five-zero-zero-zero
5  4002  4000 four-zero-zero-zero
5  9002  9000 nine-zero-zero-zero
5  1002  1000 one-zero-zero-zero
5 10002 10000 one-zero-zero-zero-zero
5  7002  7000 seven-zero-zero-zero
5  6002  6000 six-zero-zero-zero
5  3002  3000 three-zero-zero-zero
5  2002  2000 two-zero-zero-zero

# Query with a restricted span + filter.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT str FROM NumToStr WHERE y < 10 AND str LIKE '%e%' ORDER BY y]
----
https://cockroachdb.github.io/distsqlplan/decode.html?eJyMj7FqwzAYhPc-hTkIWTTEHTVlaYtpSYqbrXhQrSMIbMlIv6Al6N2LraF0KHS8-6S7-2_wwfJkZibod7QYFJYYRqYU4mrVB539hD4oOL9kWe1BYQyR0DeIk4nQuJiPiT2NZYSCpRg3baFLdLOJX0efZwlJVvroJmHUzfG-eemeH5r9jru91vrt0nenJyics6wUQ1EIWX5ak5grodui_r-sZ1qCT_w166_kQxkUaK-s16eQ48jXGMatpsrz9m8zLJNU2lbR-YrKUO6-AwAA__873XJx


query T
SELECT str FROM NumToStr WHERE y < 10 AND str LIKE '%e%' ORDER BY y
----
one
three
five
seven
eight
nine

# Query which requires a full table scan.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT str FROM NumToStr WHERE y % 1000 = 0 AND str LIKE '%i%' ORDER BY y]
----
https://cockroachdb.github.io/distsqlplan/decode.html?eJzUlEtr4zAUhffzK8SBkITRgKUksxAMeKAPTItT0uyKF651CQbHMpIMLcH_vdiGpi5NH2Tlne_j45xjuDqgNJridE8O6gECHBIcC3AswbFCwlFZk5FzxrYrPRDpJ6iAIy-r2rfthCMzlqAO8LkvCArb9LGgDaWaLDg0-TQvOpHK5vvUPodlvffG-XZ6lReerGKzWSjYhIkgCJRSUbyds3_s9fN_fMFmoWS30c0lm07yyVQpdb_dRPH1HBzr2isWSh4KJA2Hqf3RnPPpjqBEw08EOPo2VpMlPfQcyt9Img9SxuaPqQa7p7TlQFuM_efJsQdYjD3AcuwBvnhANuQqUzr61nUF7XGS3lF_zM7UNqM7a7JOpi_XHdc1NDnfT0VfRGU36gy-hcWn8N8BHLyH5TnKi3Pg5Tnw6kdw0vx6CQAA___v9_DI

query T
SELECT str FROM NumToStr WHERE y % 1000 = 0 AND str LIKE '%i%' ORDER BY y
----
five-zero-zero-zero
six-zero-zero-zero
eight-zero-zero-zero
nine-zero-zero-zero


#
# -- Join tests --
#

query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT x, str FROM NumToSquare JOIN NumToStr ON y = xsquared]
----
https://cockroachdb.github.io/distsqlplan/decode.html?eJzUlVFr2zAQgN_3K8o9taBBJDvLYhj4cd1DO8rehh_U6JYYEsuTZFgp-e_D9iC1k93FqA_Joy19p7vv4O4VKmvwQe_QQ_YTJAhQICABASkImEMhoHZ2hd5b117pgXvzB7KZgLKqm9D-LgSsrEPIXiGUYYuQwQ_9vMUn1AYdCDAYdLntHqldudPuJa-aXbD-d6MdgoDHJmQ3uRS5gmIvwDbhX-hDxOeXm432m2G07n4hwAe9RsjkXrx7isHF5CcH-an_5neI01TWGXRoBpGKluSunCjyq_abb7asxjVu8Ve4zdXdF1euN-E2l3dvq0xHVR4qSCIqOJHeg_1o63GhJx9OBw_LC2-tvPrWqgs3rK7ecHLhhpOrN5xeuOH06g0zK_YJfW0rj2dN-FmbPpo19jq8bdwKvzu76p7pPx87rpuvBn3oT1X_cV_1R22C58PzGHgRAy9jYClpWk4wpqbB8xh4EQMvY-CRsSNajenZWzqhdSckLIe-Z2M6jWkWDTPNomGmWTTMNIuGuWbNY5r1KUY3DTO6aZjRTcOMbhrmdC9idH-O0U3DjG4aZnTTMKObhjndyxjdcsqyPJ6hU7blVJob_lP25VSacy6Ptgcpvdh_-BsAAP__m1K8ow==

# Save the result of the following statement to a label.
query IT rowsort label-sq-str
SELECT i, to_english(i*i) FROM GENERATE_SERIES(1, 100) AS g(i)

# Compare the results of this query to the one above.
query IT rowsort label-sq-str
SELECT x, str FROM NumToSquare JOIN NumToStr ON y = xsquared


#
# -- Aggregation tests --
#

# Sum the numbers in the NumToStr table. The expected result is
#  n * n * (n * n + 1) / 2
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT SUM(y) FROM NumToStr]
----
https://cockroachdb.github.io/distsqlplan/decode.html?eJzElLFOwzAQhneeAv0TSB7qJC0lUxk7QFGBCWUw8SmK1MaR7UigKu-OEg-lUWsjNVJG-_Ldd-fYd0ClJL2IPRmkn-BgiMAQgyEBwxwZQ61VTsYo3X3igLX8RjpjKKu6sd12xpArTUgPsKXdEVK8i68dbUlI0mCQZEW56yW1LvdC_6yqZm-VsV1009j0dsWRtQyqscekxoqCkPKW_V_8VBSaCmHVwPv28Xy34vcXJdFFyTF3UyktSZM8SZ21I5YRn5TBpzrkgHicQ46m6i4gHqe7eKruAuJxukum6i4gHv_5n5FsydSqMjQYA-czz7rxQLIgN0uManROr1rlvcYtNz3Xb0gy1kW5W6wrF-oK_AtzLxydwHwIR35zQB176cQPJ9fUPffCC795cY35wQsv_eblNeZH_7-aBa6J_5IN3Vl78xsAAP___russg==

query R
SELECT SUM(y) FROM NumToStr
----
50005000

# Count the rows in the NumToStr table.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT COUNT(*) FROM NumToStr]
----
https://cockroachdb.github.io/distsqlplan/decode.html?eJzElDFr8zAQhvfvV3zc1IIGy3bS1FNKpwxNSppMxRTVOowhkcxJhpbg_15sD2lMIrXExaMkP_fcK4s7gNISl2KPBpJX4MAgBAYRMIiBwQRSBiXpDI3R1HzSAQv5AUnAoFBlZZvtlEGmCSE5gC3sDiGBjXjf4RqFRAIGEq0odq2kpGIv6HOuqr3Vxjana1QSKfkfQFoz0JU9ljVW5AgJr9nP1Q95TpgLq3vmx9V2ubmZ89uLmvCi5li9UpokEsqT4mn9i0Zetk9vC08r0UkrfLzL9qiHuuxwvIQe9VAJo_ESetRDJYzHS-hR_8VIOKNZoym1MtgbDecrB83IQJljN1-MrijDZ9JZq-mWq5ZrNyQa253ybrFQ3VHT4HeYO-HwBOZ9OHSbPerIScduOL6m74kTnrrN02vMd0545jbPrjHfu_9V4Hkm7kfWd6f1v68AAAD__4FMtWM=

query I
SELECT COUNT(*) FROM NumToStr
----
10000

# Count how many numbers contain the digit 5.
query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT COUNT(*) FROM NumToStr WHERE str LIKE '%five%']
----
https://cockroachdb.github.io/distsqlplan/decode.html?eJzMlE1L60AUhvf3V5QDpffCLPLV3jqriqgEtZW0XUmQmDmGQJoJMxNRSv67JFnUhnZGaYUs5-Od5-Gc4Wwh5wzn0QYl0CewgYADBFwg4AGBMYQECsFjlJKL-kob8Nk7UItAmhelqrdDAjEXCHQLKlUZAoVV9JJhgBFDAQQYqijNGkgh0k0kPmZ5uVFcqvr0Js0UCjqYOYN7_-56MBq-pm84HFFKl6vAn98CgQBzVt-xIKwI8FLt0FJFCQK1K_J9vcskEZhEinfsrhbr-ervzP53FOMcxexeL3MuGApke4-H1Q9EluuHZ9-g4u6p2P1uiEHvXA1x-l0Fg965quD2uwoGvXNVwet3FQx6vzGiDmAClAXPJXZG1eGXrXqEIUuwnXeSlyLGR8HjBtMuF02u2WAoVXtqtws_b49qwa9hWxt29sJ2N-zoyQa0q017-rB3ivdYG57oyZNTyP-14amePD2FfKHvlWX4JvpP1mWH1Z_PAAAA___lMuZp

# Result calculated here: https://play.golang.org/p/e-YsJRDsXF
query I
SELECT COUNT(*) FROM NumToStr WHERE str LIKE '%five%'
----
3439


#
# -- Limit tests --
#

query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT y FROM NumToStr LIMIT 5]
----
https://cockroachdb.github.io/distsqlplan/decode.html?eJzEk7tq60AQhvvzFOav94B1S7GVW0Owg0kXVGy0g1mQdsReIMHo3YNWhSPjxAQVKmdG3_wfYvYCy5oOqiMP-YYMAjkECgiUEKhQC_SOG_Ke3fjJBOz1B-RWwNg-hrFdCzTsCPKCYEJLkHhV7y2dSGlyENAUlGlTSO9Mp9znzsYusA_j9BiD3OzG9GfTmbCpUA8CHMN1vQ_qTJDZIH5QuCZHy06TIz3LrYc7kgf-z_1c75FBPjPI1v8J-foKxfoK5foKDx7EiXzP1tPNVd7fvB2vlfSZptP2HF1DL46bFDOVx8SlhiYfpmk2FXubRknwO5z9Cj_N4O0tnC9JLpbA5RK4-hNcD_--AgAA__9hcK3z

query T
SELECT url FROM [EXPLAIN (DISTSQL) SELECT y FROM NumToStr ORDER BY y LIMIT 5]
----
https://cockroachdb.github.io/distsqlplan/decode.html?eJzEkz9r8zAQxvf3U4RnfVWw_KeDJq-BkpTQrXhQrSMIbJ-RZGgJ_u7F8pC6NA3Fg0fd3e-eH-Z8QceGDrolD_UKCYEUAhkEcggUqAR6xzV5z24amYG9eYdKBGzXD2EqVwI1O4K6INjQEBRe9FtDJ9KGHAQMBW2bGNI722r3UXZDG9iHqXscgtqVU_qTbW3YFahGAR7Cdb0P-kxQchQ3FK7J7Aw5MsvUUv5HNf7geeAH7pez9yTShYTc_juk2ytk2yvk2yvc-SdO5HvuPC3yb21Opmslc6b5uj0PrqZnx3WMmZ_HyMWCIR_mrpwf-y62ouBXWP4KPy7g5DucrknO1sD5Grj4E1yN_z4DAAD__zIVrfA=

query I
SELECT y FROM NumToStr ORDER BY y LIMIT 5
----
1
2
3
4
5

query I
SELECT y FROM NumToStr ORDER BY y OFFSET 5 LIMIT 2
----
6 7

query I
SELECT y FROM NumToStr ORDER BY y LIMIT 0
----

query I
SELECT * FROM (SELECT y FROM NumToStr LIMIT 3) AS a ORDER BY y OFFSET 3
----

query I
SELECT y FROM NumToStr ORDER BY str LIMIT 5
----
8
88
888
8888
8885

query I
SELECT y FROM (SELECT y FROM NumToStr ORDER BY y LIMIT 5) AS a WHERE y <> 2
----
1
3
4
5

statement error memory budget exceeded
SELECT y, str, REPEAT('test', y) FROM NumToStr ORDER BY str

# Verify we use the "top K" strategy and thus don't hit OOM as above.
statement ok
SELECT y, str, REPEAT('test', y) FROM NumToStr ORDER BY str LIMIT 10
