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

284 lines
8.7 KiB
Go
Executable File

// Copyright 2023 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 TestRegressions(t *testing.T) {
RunScripts(t, []ScriptTest{
{
Name: "nullif",
SetUpScript: []string{},
Assertions: []ScriptTestAssertion{
{
Query: "select nullif(1, 1);",
Expected: []sql.Row{{nil}},
},
{
Query: "select nullif('', null);",
Expected: []sql.Row{{""}},
},
{
Query: "select nullif(10, 'a');",
Expected: []sql.Row{{10}},
},
},
},
{
Name: "coalesce",
SetUpScript: []string{},
Assertions: []ScriptTestAssertion{
{
Query: "select coalesce(null + 5, 100);",
Expected: []sql.Row{{100}},
},
{
Query: "select coalesce(null, null, 'abc');",
Expected: []sql.Row{{"abc"}},
},
{
Query: "select coalesce(null, null);",
Expected: []sql.Row{{nil}},
},
},
},
{
Name: "case / when",
SetUpScript: []string{},
Assertions: []ScriptTestAssertion{
{
Query: "SELECT\n" +
" CASE\n" +
" WHEN 1 = 1 THEN 'One is equal to One'\n" +
" ELSE 'One is not equal to One'\n" +
" END AS result;",
Expected: []sql.Row{{"One is equal to One"}},
},
{
Query: "SELECT\n" +
" CASE\n" +
" WHEN NULL IS NULL THEN 'NULL is NULL'\n" +
" ELSE 'NULL is not NULL'\n" +
" END AS result;",
Expected: []sql.Row{{"NULL is NULL"}},
},
},
},
{
Name: "ALL / DISTINCT in functions",
SetUpScript: []string{
"create table t1 (pk int);",
"insert into t1 values (1), (2), (3), (1);",
},
Assertions: []ScriptTestAssertion{
{
Query: "select all count(*) from t1;",
Expected: []sql.Row{{4}},
},
{
Query: "select all count(distinct pk) from t1;",
Expected: []sql.Row{{3}},
},
{
Query: "select all count(all pk) from t1;",
Expected: []sql.Row{{4}},
},
},
},
{
Name: "cross joins",
SetUpScript: []string{
"create table t1 (pk1 int);",
"create table t2 (pk2 int);",
"insert into t1 values (1), (2);",
"insert into t2 values (3), (4);",
},
Assertions: []ScriptTestAssertion{
{
Query: "select * from t1 cross join t2 order by pk1, pk2;",
Expected: []sql.Row{
{1, 3},
{1, 4},
{2, 3},
{2, 4},
},
},
{
Query: "select * from t1, t2 order by pk1, pk2;",
Expected: []sql.Row{
{1, 3},
{1, 4},
{2, 3},
{2, 4},
},
},
},
},
{
Name: "casting null as integer",
SetUpScript: []string{
`CREATE TABLE tab0(pk INTEGER PRIMARY KEY, col0 INTEGER, col1 FLOAT, col2 TEXT, col3 INTEGER, col4 FLOAT, col5 TEXT);`,
`INSERT INTO tab0 VALUES (0,698,169.42,'apdbu',431,316.15,'sqvis'), (1,538,676.36,'fuqeu',514,685.97,'bgwrq');`,
},
Assertions: []ScriptTestAssertion{
{
Query: "SELECT ALL + 58 FROM tab0 WHERE NULL NOT BETWEEN + 71 * CAST ( NULL AS INTEGER ) AND col4",
Skip: true, // TODO: need to implement casting NULL to a type with a CAST expression
Expected: []sql.Row{},
},
},
},
{
Name: "addition expression in prepared statement",
SetUpScript: []string{
`CREATE TABLE t1(x INTEGER);`,
`CREATE TABLE t2(y INTEGER PRIMARY KEY);`,
},
Assertions: []ScriptTestAssertion{
{
Query: `SELECT 1 IN (SELECT x+y FROM t1, t2);`,
Skip: true, // Returns "int64(0)" instead of "false", need to implement "IN" as a Doltgres expression
Expected: []sql.Row{{false}},
},
},
},
{
Name: "casting from float64 to int64 and float32",
SetUpScript: []string{
`CREATE TABLE tab0(pk INTEGER PRIMARY KEY, col0 INTEGER, col1 FLOAT, col2 TEXT, col3 INTEGER, col4 FLOAT, col5 TEXT);`,
`INSERT INTO tab0 VALUES (0,698,169.42,'apdbu',431,316.15,'sqvis'), (1,538,676.36,'fuqeu',514,685.97,'bgwrq'), (2,90,205.26,'yrrzx',123,836.88,'kpuhc'),
(3,620,864.8,'myrdv',877,820.98,'oxkuv'), (4,754,677.3,'iofrg',67,665.49,'bzqba'), (5,107,710.19,'lhfro',286,504.28,'kwwsg'), (6,904,193.16,'eozui',48,698.55,'ejyzs'),
(7,606,650.64,'ovmce',417,962.43,'dvkbh'), (8,535,18.11,'ijika',630,489.63,'hpnyu'), (9,501,776.40,'cvygg',725,75.5,'etlyv');`,
},
Assertions: []ScriptTestAssertion{
/*{
Query: "SELECT ALL * FROM tab0 cor0 WHERE ( + CAST ( - col4 AS INTEGER ) ) IN ( - col1, + col3, col3 );",
Expected: []sql.Row{},
},*/
{
Query: "SELECT * FROM tab0 WHERE - - col0 * + - col4 >= ( + CAST ( col1 AS REAL ) );",
Expected: []sql.Row{},
},
},
},
{
Name: "typecheck fails to detect doltgres types in GMS ",
SetUpScript: []string{
`CREATE TABLE tab0(col0 INTEGER, col1 INTEGER, col2 INTEGER);`,
`INSERT INTO tab0 VALUES (97,1,99), (15,81,47), (87,21,10);`,
`CREATE TABLE tab1(col0 INTEGER, col1 INTEGER, col2 INTEGER);`,
`INSERT INTO tab1 VALUES (51,14,96), (85,5,59), (91,47,68);`,
`CREATE TABLE tab2(col0 INTEGER, col1 INTEGER, col2 INTEGER);`,
`INSERT INTO tab2 VALUES(64,77,40), (75,67,58), (46,51,23);`,
},
Assertions: []ScriptTestAssertion{
{
Query: "SELECT ALL + col2 * + ( ( 43 ) ) - 47 + + col1 * CAST ( - ( + 63 ) / col0 AS INTEGER ) AS col0 FROM tab1 AS cor0;",
Expected: []sql.Row{{2490}, {4067}, {2877}},
},
{
Query: "SELECT - COUNT ( * ) - 26 * + 96 AS col2 FROM tab0 WHERE + 2 * col0 NOT BETWEEN 33 * CAST ( + 7 / 91 AS REAL ) AND 52;",
Expected: []sql.Row{{-2498}},
},
{
Query: "SELECT CAST ( + CAST ( 73 AS REAL ) AS INTEGER ) * 62 FROM tab2 WHERE NULL IS NULL;",
Expected: []sql.Row{{4526}, {4526}, {4526}},
},
},
},
{
Name: "SERIAL type column definition",
Assertions: []ScriptTestAssertion{
{
Query: "CREATE TABLE sbtest1(id SERIAL, k INTEGER DEFAULT '0' NOT NULL, c CHAR(120) DEFAULT '' NOT NULL, pad CHAR(60) DEFAULT '' NOT NULL, PRIMARY KEY (id));",
Expected: []sql.Row{},
},
{
Query: "INSERT INTO sbtest1(k, c, pad) VALUES(4284, '8386864191', '67847967371'),(9261, '339736817', '3861551598704');",
Expected: []sql.Row{},
},
},
},
{
Name: "arithmetic op with null casted as integer",
SetUpScript: []string{
"CREATE TABLE tab2(col0 INTEGER, col1 INTEGER, col2 INTEGER);",
"INSERT INTO tab2 VALUES(7,31,27), (79,17,38), (78,59,26);",
},
Assertions: []ScriptTestAssertion{
{
Query: "SELECT ALL - col0 * CAST ( col0 AS REAL ) + col1 + CAST ( NULL AS INTEGER ) AS col0 FROM tab2 AS cor0;",
Expected: []sql.Row{{nil}, {nil}, {nil}},
},
{
Query: "select 1.2 + cast ( null as integer );",
Expected: []sql.Row{{nil}},
},
},
},
{
Name: "inner join",
SetUpScript: []string{
"CREATE TABLE J1_TBL (i integer, j integer, t text);",
"CREATE TABLE J2_TBL (i integer, k integer);",
},
Assertions: []ScriptTestAssertion{
{
Query: "SELECT * FROM J1_TBL INNER JOIN J2_TBL USING (i);",
Expected: []sql.Row{},
},
},
},
{
Skip: true, // https://github.com/dolthub/doltgresql/issues/1043
Name: "use column in function when creating view",
SetUpScript: []string{
"CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified');",
},
Assertions: []ScriptTestAssertion{
{
Query: "CREATE VIEW rw_view15 AS SELECT a, upper(b) FROM base_tbl;",
Expected: []sql.Row{},
},
},
},
{
Name: "star expression with sql value or names column",
SetUpScript: []string{
`CREATE TABLE test(y INTEGER PRIMARY KEY, z INTEGER, j TEXT);`,
`INSERT INTO test VALUES (1, 2, 'first row'), (3, 4, 'second row');`,
},
Assertions: []ScriptTestAssertion{
{
Query: `SELECT *, 1, j FROM test;`,
Expected: []sql.Row{{1, 2, "first row", 1, "first row"}, {3, 4, "second row", 1, "second row"}},
},
{
Query: `SELECT j, 11, * FROM test;`,
Expected: []sql.Row{{"first row", 11, 1, 2, "first row"}, {"second row", 11, 3, 4, "second row"}},
},
{
Query: `SELECT j, 111, *, j FROM test;`,
Expected: []sql.Row{{"first row", 111, 1, 2, "first row", "first row"}, {"second row", 111, 3, 4, "second row", "second row"}},
},
},
},
})
}