2019-06-21 13:56:57 +02:00
|
|
|
package jet
|
2019-06-15 13:58:45 +02:00
|
|
|
|
|
|
|
|
import "testing"
|
|
|
|
|
|
|
|
|
|
func TestInvalidSelect(t *testing.T) {
|
2019-07-08 13:00:44 +02:00
|
|
|
assertStatementErr(t, SELECT(nil), "jet: projection is nil")
|
2019-06-15 13:58:45 +02:00
|
|
|
}
|
|
|
|
|
|
2019-06-16 11:20:44 +02:00
|
|
|
func TestSelectColumnList(t *testing.T) {
|
|
|
|
|
columnList := ColumnList{table2ColInt, table2ColFloat, table3ColInt}
|
|
|
|
|
|
|
|
|
|
assertStatement(t, SELECT(columnList).FROM(table2), `
|
2019-06-17 12:05:52 +02:00
|
|
|
SELECT table2.col_int AS "table2.col_int",
|
|
|
|
|
table2.col_float AS "table2.col_float",
|
|
|
|
|
table3.col_int AS "table3.col_int"
|
2019-06-16 11:20:44 +02:00
|
|
|
FROM db.table2;
|
|
|
|
|
`)
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-15 13:58:45 +02:00
|
|
|
func TestSelectDistinct(t *testing.T) {
|
|
|
|
|
assertStatement(t, SELECT(table1ColBool).DISTINCT(), `
|
2019-06-17 12:05:52 +02:00
|
|
|
SELECT DISTINCT table1.col_bool AS "table1.col_bool";
|
2019-06-15 13:58:45 +02:00
|
|
|
`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSelectFrom(t *testing.T) {
|
|
|
|
|
assertStatement(t, SELECT(table1ColInt, table2ColFloat).FROM(table1), `
|
2019-06-17 12:05:52 +02:00
|
|
|
SELECT table1.col_int AS "table1.col_int",
|
|
|
|
|
table2.col_float AS "table2.col_float"
|
2019-06-15 13:58:45 +02:00
|
|
|
FROM db.table1;
|
|
|
|
|
`)
|
|
|
|
|
assertStatement(t, SELECT(table1ColInt, table2ColFloat).FROM(table1.INNER_JOIN(table2, table1ColInt.EQ(table2ColInt))), `
|
2019-06-17 12:05:52 +02:00
|
|
|
SELECT table1.col_int AS "table1.col_int",
|
|
|
|
|
table2.col_float AS "table2.col_float"
|
2019-06-15 13:58:45 +02:00
|
|
|
FROM db.table1
|
2019-06-17 12:05:52 +02:00
|
|
|
INNER JOIN db.table2 ON (table1.col_int = table2.col_int);
|
2019-06-15 13:58:45 +02:00
|
|
|
`)
|
|
|
|
|
assertStatement(t, table1.INNER_JOIN(table2, table1ColInt.EQ(table2ColInt)).SELECT(table1ColInt, table2ColFloat), `
|
2019-06-17 12:05:52 +02:00
|
|
|
SELECT table1.col_int AS "table1.col_int",
|
|
|
|
|
table2.col_float AS "table2.col_float"
|
2019-06-15 13:58:45 +02:00
|
|
|
FROM db.table1
|
2019-06-17 12:05:52 +02:00
|
|
|
INNER JOIN db.table2 ON (table1.col_int = table2.col_int);
|
2019-06-15 13:58:45 +02:00
|
|
|
`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSelectWhere(t *testing.T) {
|
|
|
|
|
assertStatement(t, SELECT(table1ColInt).FROM(table1).WHERE(Bool(true)), `
|
2019-06-17 12:05:52 +02:00
|
|
|
SELECT table1.col_int AS "table1.col_int"
|
2019-06-15 13:58:45 +02:00
|
|
|
FROM db.table1
|
|
|
|
|
WHERE $1;
|
|
|
|
|
`, true)
|
|
|
|
|
assertStatement(t, SELECT(table1ColInt).FROM(table1).WHERE(table1ColInt.GT_EQ(Int(10))), `
|
2019-06-17 12:05:52 +02:00
|
|
|
SELECT table1.col_int AS "table1.col_int"
|
2019-06-15 13:58:45 +02:00
|
|
|
FROM db.table1
|
2019-06-17 12:05:52 +02:00
|
|
|
WHERE table1.col_int >= $1;
|
2019-06-15 13:58:45 +02:00
|
|
|
`, int64(10))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSelectGroupBy(t *testing.T) {
|
|
|
|
|
assertStatement(t, SELECT(table2ColInt).FROM(table2).GROUP_BY(table2ColFloat), `
|
2019-06-17 12:05:52 +02:00
|
|
|
SELECT table2.col_int AS "table2.col_int"
|
2019-06-15 13:58:45 +02:00
|
|
|
FROM db.table2
|
2019-06-17 12:05:52 +02:00
|
|
|
GROUP BY table2.col_float;
|
2019-06-15 13:58:45 +02:00
|
|
|
`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSelectHaving(t *testing.T) {
|
|
|
|
|
assertStatement(t, SELECT(table3ColInt).FROM(table3).HAVING(table1ColBool.EQ(Bool(true))), `
|
2019-06-17 12:05:52 +02:00
|
|
|
SELECT table3.col_int AS "table3.col_int"
|
2019-06-15 13:58:45 +02:00
|
|
|
FROM db.table3
|
2019-06-17 12:05:52 +02:00
|
|
|
HAVING table1.col_bool = $1;
|
2019-06-15 13:58:45 +02:00
|
|
|
`, true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSelectOrderBy(t *testing.T) {
|
|
|
|
|
assertStatement(t, SELECT(table2ColFloat).FROM(table2).ORDER_BY(table2ColInt.DESC()), `
|
2019-06-17 12:05:52 +02:00
|
|
|
SELECT table2.col_float AS "table2.col_float"
|
2019-06-15 13:58:45 +02:00
|
|
|
FROM db.table2
|
2019-06-17 12:05:52 +02:00
|
|
|
ORDER BY table2.col_int DESC;
|
2019-06-16 11:20:44 +02:00
|
|
|
`)
|
|
|
|
|
assertStatement(t, SELECT(table2ColFloat).FROM(table2).ORDER_BY(table2ColInt.DESC(), table2ColInt.ASC()), `
|
2019-06-17 12:05:52 +02:00
|
|
|
SELECT table2.col_float AS "table2.col_float"
|
2019-06-16 11:20:44 +02:00
|
|
|
FROM db.table2
|
2019-06-17 12:05:52 +02:00
|
|
|
ORDER BY table2.col_int DESC, table2.col_int ASC;
|
2019-06-15 13:58:45 +02:00
|
|
|
`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSelectLimitOffset(t *testing.T) {
|
|
|
|
|
assertStatement(t, SELECT(table2ColInt).FROM(table2).LIMIT(10), `
|
2019-06-17 12:05:52 +02:00
|
|
|
SELECT table2.col_int AS "table2.col_int"
|
2019-06-15 13:58:45 +02:00
|
|
|
FROM db.table2
|
|
|
|
|
LIMIT $1;
|
|
|
|
|
`, int64(10))
|
|
|
|
|
assertStatement(t, SELECT(table2ColInt).FROM(table2).LIMIT(10).OFFSET(2), `
|
2019-06-17 12:05:52 +02:00
|
|
|
SELECT table2.col_int AS "table2.col_int"
|
2019-06-15 13:58:45 +02:00
|
|
|
FROM db.table2
|
|
|
|
|
LIMIT $1
|
|
|
|
|
OFFSET $2;
|
|
|
|
|
`, int64(10), int64(2))
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-20 11:22:01 +02:00
|
|
|
func TestSelectSets(t *testing.T) {
|
|
|
|
|
select1 := SELECT(table1ColBool).FROM(table1)
|
|
|
|
|
select2 := SELECT(table2ColBool).FROM(table2)
|
|
|
|
|
|
|
|
|
|
assertStatement(t, select1.UNION(select2), `
|
|
|
|
|
(
|
|
|
|
|
(
|
|
|
|
|
SELECT table1.col_bool AS "table1.col_bool"
|
|
|
|
|
FROM db.table1
|
|
|
|
|
)
|
|
|
|
|
UNION
|
|
|
|
|
(
|
|
|
|
|
SELECT table2.col_bool AS "table2.col_bool"
|
|
|
|
|
FROM db.table2
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
`)
|
|
|
|
|
assertStatement(t, select1.UNION_ALL(select2), `
|
|
|
|
|
(
|
|
|
|
|
(
|
|
|
|
|
SELECT table1.col_bool AS "table1.col_bool"
|
|
|
|
|
FROM db.table1
|
|
|
|
|
)
|
|
|
|
|
UNION ALL
|
|
|
|
|
(
|
|
|
|
|
SELECT table2.col_bool AS "table2.col_bool"
|
|
|
|
|
FROM db.table2
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
`)
|
|
|
|
|
|
|
|
|
|
assertStatement(t, select1.INTERSECT(select2), `
|
|
|
|
|
(
|
|
|
|
|
(
|
|
|
|
|
SELECT table1.col_bool AS "table1.col_bool"
|
|
|
|
|
FROM db.table1
|
|
|
|
|
)
|
|
|
|
|
INTERSECT
|
|
|
|
|
(
|
|
|
|
|
SELECT table2.col_bool AS "table2.col_bool"
|
|
|
|
|
FROM db.table2
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
`)
|
|
|
|
|
|
|
|
|
|
assertStatement(t, select1.INTERSECT_ALL(select2), `
|
|
|
|
|
(
|
|
|
|
|
(
|
|
|
|
|
SELECT table1.col_bool AS "table1.col_bool"
|
|
|
|
|
FROM db.table1
|
|
|
|
|
)
|
|
|
|
|
INTERSECT ALL
|
|
|
|
|
(
|
|
|
|
|
SELECT table2.col_bool AS "table2.col_bool"
|
|
|
|
|
FROM db.table2
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
`)
|
|
|
|
|
assertStatement(t, select1.EXCEPT(select2), `
|
|
|
|
|
(
|
|
|
|
|
(
|
|
|
|
|
SELECT table1.col_bool AS "table1.col_bool"
|
|
|
|
|
FROM db.table1
|
|
|
|
|
)
|
|
|
|
|
EXCEPT
|
|
|
|
|
(
|
|
|
|
|
SELECT table2.col_bool AS "table2.col_bool"
|
|
|
|
|
FROM db.table2
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
`)
|
|
|
|
|
|
|
|
|
|
assertStatement(t, select1.EXCEPT_ALL(select2), `
|
|
|
|
|
(
|
|
|
|
|
(
|
|
|
|
|
SELECT table1.col_bool AS "table1.col_bool"
|
|
|
|
|
FROM db.table1
|
|
|
|
|
)
|
|
|
|
|
EXCEPT ALL
|
|
|
|
|
(
|
|
|
|
|
SELECT table2.col_bool AS "table2.col_bool"
|
|
|
|
|
FROM db.table2
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
`)
|
|
|
|
|
|
|
|
|
|
}
|