Files
2026-07-13 12:32:25 +08:00

845 lines
21 KiB
Go

// Copyright 2024 Dolthub, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package _go
import (
"testing"
"github.com/dolthub/go-mysql-server/sql"
)
func TestValuesStatement(t *testing.T) {
RunScripts(t, ValuesStatementTests)
}
var ValuesStatementTests = []ScriptTest{
{
Name: "basic values statements",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (VALUES (1), (2), (3)) sqa;`,
Expected: []sql.Row{
{1},
{2},
{3},
},
},
{
Query: `SELECT * FROM (VALUES (1, 2), (3, 4)) sqa;`,
Expected: []sql.Row{
{1, 2},
{3, 4},
},
},
{
Query: `SELECT i * 10, j * 100 FROM (VALUES (1, 2), (3, 4)) sqa(i, j);`,
Expected: []sql.Row{
{10, 200},
{30, 400},
},
},
},
},
{
Name: "VALUES with mixed int and decimal",
Assertions: []ScriptTestAssertion{
{
// Integer first, then decimal - should resolve to numeric
Query: `SELECT * FROM (VALUES(1),(2.01),(3)) v(n);`,
Expected: []sql.Row{
{Numeric("1")},
{Numeric("2.01")},
{Numeric("3")},
},
},
{
// Decimal first, then integers - should resolve to numeric
Query: `SELECT * FROM (VALUES(1.01),(2),(3)) v(n);`,
Expected: []sql.Row{
{Numeric("1.01")},
{Numeric("2")},
{Numeric("3")},
},
},
{
// SUM should work directly now that VALUES has correct type
Query: `SELECT SUM(n) FROM (VALUES(1),(2.01),(3)) v(n);`,
Expected: []sql.Row{{Numeric("6.01")}},
},
{
// Exact repro from issue #1648: integer first, explicit cast to numeric
Query: `SELECT SUM(n::numeric) FROM (VALUES(1),(2.01),(3)) v(n);`,
Expected: []sql.Row{{Numeric("6.01")}},
},
{
// Exact repro from issue #1648: decimal first, explicit cast to numeric
Query: `SELECT SUM(n::numeric) FROM (VALUES(1.01),(2),(3)) v(n);`,
Expected: []sql.Row{{Numeric("6.01")}},
},
},
},
{
Name: "VALUES with multiple columns mixed types",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (VALUES(1, 'a'), (2.5, 'b')) v(num, str);`,
Expected: []sql.Row{
{Numeric("1"), "a"},
{Numeric("2.5"), "b"},
},
},
},
},
{
Name: "VALUES with GROUP BY",
Assertions: []ScriptTestAssertion{
{
// GROUP BY on mixed type VALUES - tests that GetField types are updated correctly
Query: `SELECT n, COUNT(*) FROM (VALUES(1),(2.5),(1),(3.5),(2.5)) v(n) GROUP BY n ORDER BY n;`,
Expected: []sql.Row{
{Numeric("1"), int64(2)},
{Numeric("2.5"), int64(2)},
{Numeric("3.5"), int64(1)},
},
},
{
// SUM with GROUP BY
Query: `SELECT category, SUM(amount) FROM (VALUES('a', 1),('b', 2.5),('a', 3),('b', 4.5)) v(category, amount) GROUP BY category ORDER BY category;`,
Expected: []sql.Row{
{"a", Numeric("4")},
{"b", Numeric("7.0")},
},
},
},
},
{
Name: "VALUES with DISTINCT",
Assertions: []ScriptTestAssertion{
{
// DISTINCT on mixed type VALUES
Query: `SELECT DISTINCT n FROM (VALUES(1),(2.5),(1),(2.5),(3)) v(n) ORDER BY n;`,
Expected: []sql.Row{
{Numeric("1")},
{Numeric("2.5")},
{Numeric("3")},
},
},
},
},
{
Name: "VALUES with LIMIT and OFFSET",
Assertions: []ScriptTestAssertion{
{
// LIMIT on mixed type VALUES
Query: `SELECT * FROM (VALUES(1),(2.5),(3),(4.5),(5)) v(n) LIMIT 3;`,
Expected: []sql.Row{
{Numeric("1")},
{Numeric("2.5")},
{Numeric("3")},
},
},
{
// LIMIT with OFFSET
Query: `SELECT * FROM (VALUES(1),(2.5),(3),(4.5),(5)) v(n) LIMIT 2 OFFSET 2;`,
Expected: []sql.Row{
{Numeric("3")},
{Numeric("4.5")},
},
},
},
},
{
Name: "VALUES with ORDER BY",
Assertions: []ScriptTestAssertion{
{
// ORDER BY on mixed type VALUES - ascending
Query: `SELECT * FROM (VALUES(3),(1.5),(2),(4.5)) v(n) ORDER BY n;`,
Expected: []sql.Row{
{Numeric("1.5")},
{Numeric("2")},
{Numeric("3")},
{Numeric("4.5")},
},
},
{
// ORDER BY descending
Query: `SELECT * FROM (VALUES(3),(1.5),(2),(4.5)) v(n) ORDER BY n DESC;`,
Expected: []sql.Row{
{Numeric("4.5")},
{Numeric("3")},
{Numeric("2")},
{Numeric("1.5")},
},
},
},
},
{
Name: "VALUES in subquery",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (SELECT n * 2 AS doubled FROM (VALUES(1),(2.5),(3)) v(n)) sub;`,
Expected: []sql.Row{
{Numeric("2")},
{Numeric("5.0")},
{Numeric("6")},
},
},
{
Query: `SELECT * FROM (SELECT * FROM (VALUES(1),(2.5),(3),(4.5)) v(n) LIMIT 2) sub;`,
Expected: []sql.Row{
{Numeric("1")},
{Numeric("2.5")},
},
},
{
Query: `SELECT * FROM (SELECT * FROM (VALUES(3),(1.5),(2)) v(n) ORDER BY n) sub;`,
Expected: []sql.Row{
{Numeric("1.5")},
{Numeric("2")},
{Numeric("3")},
},
},
},
},
{
Name: "VALUES with WHERE clause (Filter node)",
Assertions: []ScriptTestAssertion{
{
// Filter on mixed type VALUES
Query: `SELECT * FROM (VALUES(1),(2.5),(3),(4.5),(5)) v(n) WHERE n > 2;`,
Expected: []sql.Row{
{Numeric("2.5")},
{Numeric("3")},
{Numeric("4.5")},
{Numeric("5")},
},
},
{
// Filter with multiple conditions
Query: `SELECT * FROM (VALUES(1),(2.5),(3),(4.5),(5)) v(n) WHERE n > 1 AND n < 4.5;`,
Expected: []sql.Row{
{Numeric("2.5")},
{Numeric("3")},
},
},
},
},
{
Name: "VALUES with aggregate functions",
Assertions: []ScriptTestAssertion{
{
// AVG on mixed types
Query: `SELECT AVG(n) FROM (VALUES(1),(2),(3),(4)) v(n);`,
Expected: []sql.Row{{2.5}},
},
{
// MIN/MAX on mixed types
Query: `SELECT MIN(n), MAX(n) FROM (VALUES(1),(2.5),(3),(0.5)) v(n);`,
Expected: []sql.Row{
{Numeric("0.5"), Numeric("3")},
},
},
},
},
{
Name: "VALUES combined operations",
Assertions: []ScriptTestAssertion{
{
// GROUP BY + ORDER BY + LIMIT
Query: `SELECT n, COUNT(*) as cnt FROM (VALUES(1),(2.5),(1),(2.5),(3),(1)) v(n) GROUP BY n ORDER BY cnt DESC LIMIT 2;`,
Expected: []sql.Row{
{Numeric("1"), int64(3)},
{Numeric("2.5"), int64(2)},
},
},
{
// DISTINCT + ORDER BY + LIMIT
Query: `SELECT DISTINCT n FROM (VALUES(1),(2.5),(1),(3),(2.5),(4)) v(n) ORDER BY n DESC LIMIT 3;`,
Expected: []sql.Row{
{Numeric("4")},
{Numeric("3")},
{Numeric("2.5")},
},
},
{
// WHERE + ORDER BY + LIMIT
Query: `SELECT * FROM (VALUES(1),(2.5),(3),(4.5),(5)) v(n) WHERE n > 1 ORDER BY n DESC LIMIT 2;`,
Expected: []sql.Row{
{Numeric("5")},
{Numeric("4.5")},
},
},
},
},
{
Name: "VALUES with single row (no type unification needed)",
Assertions: []ScriptTestAssertion{
{
// Single row should pass through unchanged
Query: `SELECT * FROM (VALUES(42)) v(n);`,
Expected: []sql.Row{
{int32(42)},
},
},
{
// Single row with decimal
Query: `SELECT * FROM (VALUES(3.14)) v(n);`,
Expected: []sql.Row{
{Numeric("3.14")},
},
},
},
},
{
Name: "VALUES with NULL values",
Assertions: []ScriptTestAssertion{
{
// NULL mixed with integers - should resolve to integer, NULL stays NULL
Query: `SELECT * FROM (VALUES(1),(NULL),(3)) v(n);`,
Expected: []sql.Row{
{int32(1)},
{nil},
{int32(3)},
},
},
{
// NULL mixed with decimals - should resolve to numeric
Query: `SELECT * FROM (VALUES(1.5),(NULL),(3.5)) v(n);`,
Expected: []sql.Row{
{Numeric("1.5")},
{nil},
{Numeric("3.5")},
},
},
{
// NULL mixed with int and decimal - should resolve to numeric
Query: `SELECT * FROM (VALUES(1),(NULL),(2.5)) v(n);`,
Expected: []sql.Row{
{Numeric("1")},
{nil},
{Numeric("2.5")},
},
},
{
// All NULLs - should resolve to text (PostgreSQL behavior)
Query: `SELECT * FROM (VALUES(NULL),(NULL)) v(n);`,
Expected: []sql.Row{
{nil},
{nil},
},
},
},
},
{
Name: "VALUES type mismatch errors",
Assertions: []ScriptTestAssertion{
{
// Integer and unknown('text'): FindCommonType resolves to int4 (the non-unknown type),
// then the I/O cast from 'text' to int4 fails at execution time. This matches PostgreSQL behavior:
// psql returns "invalid input syntax for type integer: "text""
Query: `SELECT * FROM (VALUES(1),('text'),(3)) v(n);`,
ExpectedErr: "invalid input syntax for type int4",
},
{
// Boolean and integer cannot be matched
Query: `SELECT * FROM (VALUES(true),(1),(false)) v(n);`,
ExpectedErr: "cannot be matched",
},
},
},
{
Name: "VALUES with all unknown types (string literals)",
Assertions: []ScriptTestAssertion{
{
// All string literals should resolve to text
Query: `SELECT * FROM (VALUES('a'),('b'),('c')) v(n);`,
Expected: []sql.Row{
{"a"},
{"b"},
{"c"},
},
},
{
// String literals with operations
Query: `SELECT n || '!' FROM (VALUES('hello'),('world')) v(n);`,
Expected: []sql.Row{
{"hello!"},
{"world!"},
},
},
},
},
{
Name: "VALUES with array types",
Assertions: []ScriptTestAssertion{
{
// Integer arrays: doltgresql returns arrays in text format over the wire
Query: `SELECT * FROM (VALUES(ARRAY[1,2]),(ARRAY[3,4])) v(arr);`,
Expected: []sql.Row{
{"{1,2}"},
{"{3,4}"},
},
},
{
// Text arrays: doltgresql returns arrays in text format over the wire
Query: `SELECT * FROM (VALUES(ARRAY['a','b']),(ARRAY['c','d'])) v(arr);`,
Expected: []sql.Row{
{"{a,b}"},
{"{c,d}"},
},
},
},
},
{
Name: "VALUES with all same type multi-row (no casts needed)",
Assertions: []ScriptTestAssertion{
{
// All integers
Query: `SELECT * FROM (VALUES(1),(2),(3)) v(n);`,
Expected: []sql.Row{
{int32(1)},
{int32(2)},
{int32(3)},
},
},
{
// All decimals
Query: `SELECT * FROM (VALUES(1.5),(2.5),(3.5)) v(n);`,
Expected: []sql.Row{
{Numeric("1.5")},
{Numeric("2.5")},
{Numeric("3.5")},
},
},
{
// All text
Query: `SELECT * FROM (VALUES('x'),('y'),('z')) v(n);`,
Expected: []sql.Row{
{"x"},
{"y"},
{"z"},
},
},
},
},
{
Name: "VALUES with multi-column partial cast",
Assertions: []ScriptTestAssertion{
{
// Only first column needs cast
Query: `SELECT * FROM (VALUES(1, 'a'),(2.5, 'b'),(3, 'c')) v(num, str);`,
Expected: []sql.Row{
{Numeric("1"), "a"},
{Numeric("2.5"), "b"},
{Numeric("3"), "c"},
},
},
{
// Only second column needs cast
Query: `SELECT * FROM (VALUES(1, 10),(2, 20.5),(3, 30)) v(a, b);`,
Expected: []sql.Row{
{int32(1), Numeric("10")},
{int32(2), Numeric("20.5")},
{int32(3), Numeric("30")},
},
},
},
},
{
Name: "VALUES in CTE (WITH clause)",
Assertions: []ScriptTestAssertion{
{
// Mixed types via CTE
Query: `WITH nums AS (SELECT * FROM (VALUES(1),(2.5),(3)) v(n)) SELECT * FROM nums;`,
Expected: []sql.Row{
{Numeric("1")},
{Numeric("2.5")},
{Numeric("3")},
},
},
{
// SUM over CTE
Query: `WITH nums AS (SELECT * FROM (VALUES(1),(2.5),(3)) v(n)) SELECT SUM(n) FROM nums;`,
Expected: []sql.Row{{Numeric("6.5")}},
},
},
},
{
Name: "VALUES with JOIN",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT a.n, b.label FROM (VALUES(1),(2),(3)) a(n) JOIN (VALUES(1, 'one'),(2, 'two'),(3, 'three')) b(id, label) ON a.n = b.id;`,
Expected: []sql.Row{
{int32(1), "one"},
{int32(2), "two"},
{int32(3), "three"},
},
},
{
// Mixed types in one of the joined VALUES
Query: `SELECT a.n, b.label FROM (VALUES(1),(2.5),(3)) a(n) JOIN (VALUES(1, 'one'),(3, 'three')) b(id, label) ON a.n = b.id;`,
Expected: []sql.Row{
{Numeric("1"), "one"},
{Numeric("3"), "three"},
},
},
},
},
{
Name: "VALUES with same-type booleans",
Assertions: []ScriptTestAssertion{
{
// All booleans, returned as "t"/"f" over the wire
Query: `SELECT * FROM (VALUES(true),(false),(true)) v(b);`,
Expected: []sql.Row{
{"t"},
{"f"},
{"t"},
},
},
{
// Boolean WHERE filter
Query: `SELECT * FROM (VALUES(true),(false),(true),(false)) v(b) WHERE b = true;`,
Expected: []sql.Row{
{"t"},
{"t"},
},
},
},
},
{
Name: "VALUES with case-sensitive quoted column names",
Assertions: []ScriptTestAssertion{
{
// Column names w/ quotes preserve case; unquoted are lowercased by the parser
Query: `SELECT "ColA", "colb" FROM (VALUES(1, 2),(3.5, 4.5)) v("ColA", "colb");`,
Expected: []sql.Row{
{Numeric("1"), Numeric("2")},
{Numeric("3.5"), Numeric("4.5")},
},
},
{
// Mixed case: one quoted (preserved), one unquoted (lowered)
Query: `SELECT "MixedCase", plain FROM (VALUES(1, 'a'),(2.5, 'b')) v("MixedCase", plain);`,
Expected: []sql.Row{
{Numeric("1"), "a"},
{Numeric("2.5"), "b"},
},
},
{
// SUM with quoted column name
Query: `SELECT SUM("Val") FROM (VALUES(1),(2.5),(3)) v("Val");`,
Expected: []sql.Row{{Numeric("6.5")}},
},
},
},
{
Name: "VALUES with case-differing quoted columns and aggregates",
Assertions: []ScriptTestAssertion{
{
// TODO: GMS is case-insensitive for identifiers, but
// Postgres requires case-sensitivity for quoted identifiers.
// Columns "Val" and "val" both become "val" after
// strings.ToLower, so their aggregates match the wrong column.
Skip: true,
Query: `SELECT SUM("Val"), SUM("val") FROM (VALUES(1, 10),(2.5, 20)) v("Val", "val");`,
Expected: []sql.Row{
{Numeric("3.5"), int64(30)},
},
},
},
},
{
Name: "values inside subquery preserves projections",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (SELECT n * 2 AS doubled FROM (VALUES (1), (2), (3)) v(n)) sub;`,
Expected: []sql.Row{
{2},
{4},
{6},
},
},
{
Query: `SELECT * FROM (SELECT n * 2 AS doubled FROM (VALUES (1), (2.5), (3)) v(n)) sub;`,
Expected: []sql.Row{
{Numeric("2")},
{Numeric("5.0")},
{Numeric("6")},
},
},
},
},
{
Name: "values inside subquery preserves LIMIT",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (SELECT * FROM (VALUES (1), (2), (3), (4)) v(n) LIMIT 2) sub;`,
Expected: []sql.Row{
{1},
{2},
},
},
{
Query: `SELECT * FROM (SELECT * FROM (VALUES (1), (2.5), (3), (4.5)) v(n) LIMIT 2) sub;`,
Expected: []sql.Row{
{Numeric("1")},
{Numeric("2.5")},
},
},
},
},
{
Name: "values inside subquery preserves ORDER BY",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (SELECT * FROM (VALUES (3), (1), (2)) v(n) ORDER BY n) sub;`,
Expected: []sql.Row{
{1},
{2},
{3},
},
},
{
Query: `SELECT * FROM (SELECT * FROM (VALUES (3), (1.5), (2)) v(n) ORDER BY n) sub;`,
Expected: []sql.Row{
{Numeric("1.5")},
{Numeric("2")},
{Numeric("3")},
},
},
},
},
{
Name: "values inside subquery preserves DISTINCT",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (SELECT DISTINCT * FROM (VALUES (1), (1), (2), (2), (3)) v(n)) sub;`,
Expected: []sql.Row{
{1},
{2},
{3},
},
},
{
Query: `SELECT * FROM (SELECT DISTINCT * FROM (VALUES (1), (1), (2.5), (2.5), (3)) v(n)) sub;`,
Expected: []sql.Row{
{Numeric("1")},
{Numeric("2.5")},
{Numeric("3")},
},
},
},
},
{
Name: "values inside subquery preserves WHERE",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (SELECT * FROM (VALUES (1), (2), (3), (4), (5)) v(n) WHERE n > 3) sub;`,
Expected: []sql.Row{
{4},
{5},
},
},
{
Query: `SELECT * FROM (SELECT * FROM (VALUES (1), (2.5), (3), (4.5), (5)) v(n) WHERE n > 3) sub;`,
Expected: []sql.Row{
{Numeric("4.5")},
{Numeric("5")},
},
},
},
},
{
Name: "values inside subquery preserves OFFSET",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (SELECT * FROM (VALUES (10), (20), (30)) v(n) OFFSET 1) sub;`,
Expected: []sql.Row{
{20},
{30},
},
},
{
Query: `SELECT * FROM (SELECT * FROM (VALUES (10), (20), (30), (40), (50)) v(n) LIMIT 2 OFFSET 1) sub;`,
Expected: []sql.Row{
{20},
{30},
},
},
{
Query: `SELECT * FROM (SELECT * FROM (VALUES (10), (20.5), (30)) v(n) OFFSET 1) sub;`,
Expected: []sql.Row{
{Numeric("20.5")},
{Numeric("30")},
},
},
{
Query: `SELECT * FROM (SELECT * FROM (VALUES (10), (20.5), (30), (40.5), (50)) v(n) LIMIT 2 OFFSET 1) sub;`,
Expected: []sql.Row{
{Numeric("20.5")},
{Numeric("30")},
},
},
},
},
{
Name: "values inside subquery preserves ORDER BY with LIMIT",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (SELECT * FROM (VALUES (5), (3), (1), (4), (2)) v(n) ORDER BY n LIMIT 3) sub;`,
Expected: []sql.Row{
{1},
{2},
{3},
},
},
{
Query: `SELECT * FROM (SELECT * FROM (VALUES (5), (3.5), (1), (4), (2.5)) v(n) ORDER BY n LIMIT 3) sub;`,
Expected: []sql.Row{
{Numeric("1")},
{Numeric("2.5")},
{Numeric("3.5")},
},
},
},
},
{
Name: "values inside subquery preserves GROUP BY with aggregate",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (SELECT n, count(*) AS cnt FROM (VALUES (1), (1), (2), (2), (2), (3)) v(n) GROUP BY n ORDER BY n) sub;`,
Expected: []sql.Row{
{1, int64(2)},
{2, int64(3)},
{3, int64(1)},
},
},
{
Query: `SELECT * FROM (SELECT n, count(*) AS cnt FROM (VALUES (1), (1), (2.5), (2.5), (2.5), (3)) v(n) GROUP BY n ORDER BY n) sub;`,
Expected: []sql.Row{
{Numeric("1"), int64(2)},
{Numeric("2.5"), int64(3)},
{Numeric("3"), int64(1)},
},
},
},
},
{
Name: "values inside subquery preserves HAVING",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (SELECT n, count(*) AS cnt FROM (VALUES (1), (1), (2), (2), (2), (3)) v(n) GROUP BY n HAVING count(*) > 1 ORDER BY n) sub;`,
Expected: []sql.Row{
{1, int64(2)},
{2, int64(3)},
},
},
{
Query: `SELECT * FROM (SELECT n, count(*) AS cnt FROM (VALUES (1), (1), (2.5), (2.5), (2.5), (3)) v(n) GROUP BY n HAVING count(*) > 1 ORDER BY n) sub;`,
Expected: []sql.Row{
{Numeric("1"), int64(2)},
{Numeric("2.5"), int64(3)},
},
},
},
},
{
Name: "values inside subquery preserves column aliasing",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (SELECT n AS val, n * 10 AS tenfold FROM (VALUES (1), (2), (3)) v(n)) sub;`,
Expected: []sql.Row{
{1, 10},
{2, 20},
{3, 30},
},
},
{
Query: `SELECT * FROM (SELECT n AS val, n * 10 AS tenfold FROM (VALUES (1), (2.5), (3)) v(n)) sub;`,
Expected: []sql.Row{
{Numeric("1"), Numeric("10")},
{Numeric("2.5"), Numeric("25.0")},
{Numeric("3"), Numeric("30")},
},
},
},
},
{
Name: "values inside subquery preserves column subset selection",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (SELECT a FROM (VALUES (1, 10), (2, 20), (3, 30)) v(a, b)) sub;`,
Expected: []sql.Row{
{1},
{2},
{3},
},
},
},
},
{
Name: "values subquery trivial SELECT * still unwraps correctly",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (SELECT * FROM (VALUES (1), (2), (3)) v(n)) sub;`,
Expected: []sql.Row{
{1},
{2},
{3},
},
},
},
},
{
Name: "values inside subquery with multiple combined clauses",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT * FROM (SELECT DISTINCT n FROM (VALUES (3), (1), (1), (2), (2), (3)) v(n) ORDER BY n LIMIT 2) sub;`,
Expected: []sql.Row{
{1},
{2},
},
},
{
Query: `SELECT * FROM (SELECT DISTINCT n FROM (VALUES (3), (1.5), (1.5), (2), (2), (3)) v(n) ORDER BY n LIMIT 2) sub;`,
Expected: []sql.Row{
{Numeric("1.5")},
{Numeric("2")},
},
},
},
},
{
Name: "values in JOIN preserves inner subquery semantics",
Assertions: []ScriptTestAssertion{
{
Query: `SELECT a.n, b.m FROM (VALUES (1), (2)) a(n) JOIN (SELECT m * 10 AS m FROM (VALUES (1), (2)) v(m)) b ON a.n = b.m / 10;`,
Expected: []sql.Row{
{1, 10},
{2, 20},
},
},
{
Query: `SELECT a.n, b.m FROM (VALUES (1), (2.5)) a(n) JOIN (SELECT m * 10 AS m FROM (VALUES (1), (2.5)) v(m)) b ON a.n = b.m / 10;`,
Expected: []sql.Row{
{Numeric("1"), Numeric("10")},
{Numeric("2.5"), Numeric("25.0")},
},
},
},
},
}