mirror of
https://github.com/pocoproject/poco.git
synced 2025-12-13 18:17:12 +01:00
* chore(CppParser): 0, NULL --> nullptr * chore(Crypto): 0, NULL --> nullptr * chore(DNSSD): 0, NULL --> nullptr * chore(Encodings): 0, NULL --> nullptr * chore(CppUnit): Correct indentation. * chore(Foundation): 0, NULL --> nullptr * chore(CMake): Always warn about wrong nullptr usage when compiling with GCC or CLang * chore(Net): 0, NULL --> nullptr * chore(Foundation): 0, NULL --> nullptr * chore(Data): 0, NULL --> nullptr * chore(macOS): 0, NULL --> nullptr * chore(XML): 0, NULL --> nullptr * chore(Zip): 0, NULL --> nullptr * chore(Util): 0, NULL --> nullptr * chore(Net/NetSSL): 0, NULL --> nullptr * chore(Bonjour): 0, NULL --> nullptr * chore(MongoDB, Redis): 0, NULL --> nullptr * chore(Poco): 0, NULL --> nullptr * chore(Win32): 0, NULL --> nullptr * chore(CMake): Only warn about nullptr when verbose warnings are enabled. * Potential fix for code scanning alert no. 1634: Guarded Free Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> * chore(Net): Fix warning reported by gitlab. * chore(gitlab CI): attempt to clean to gain disk space on the runner. * chore(gitlab CI): Run build with --parallel 4, correct docker cleanup. --------- Co-authored-by: Aleksandar Fabijanic <aleks-f@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
This commit is contained in:
@@ -16,7 +16,7 @@ TEST(SelectTest) {
|
||||
|
||||
TEST(SelectExprTest) {
|
||||
TEST_PARSE_SINGLE_SQL("SELECT a, MAX(b), CUSTOM(c, F(un)) FROM students;", kStmtSelect, SelectStatement, result,
|
||||
stmt);
|
||||
stmt);
|
||||
|
||||
ASSERT_NULL(stmt->whereClause);
|
||||
ASSERT_NULL(stmt->groupBy);
|
||||
@@ -49,8 +49,8 @@ TEST(SelectExprTest) {
|
||||
|
||||
TEST(SelectUnaryMinusTest) {
|
||||
TEST_PARSE_SINGLE_SQL(
|
||||
"SELECT 10 - 20, 10 + -20, 10 +-20, 10+-20, 9223372036854775807, -9223372036854775808, 10-5.2, 10+-5.2",
|
||||
kStmtSelect, SelectStatement, result, stmt);
|
||||
"SELECT 10 - 20, 10 + -20, 10 +-20, 10+-20, 9223372036854775807, -9223372036854775808, 10-5.2, 10+-5.2",
|
||||
kStmtSelect, SelectStatement, result, stmt);
|
||||
|
||||
ASSERT_EQ(stmt->selectList->size(), 8);
|
||||
|
||||
@@ -133,7 +133,7 @@ TEST(SelectSubstrTest) {
|
||||
|
||||
TEST(SelectHavingTest) {
|
||||
TEST_PARSE_SINGLE_SQL("SELECT city, AVG(grade) AS avg_grade FROM students GROUP BY city HAVING AVG(grade) < -2.0",
|
||||
kStmtSelect, SelectStatement, result, stmt);
|
||||
kStmtSelect, SelectStatement, result, stmt);
|
||||
|
||||
ASSERT_FALSE(stmt->selectDistinct);
|
||||
|
||||
@@ -163,7 +163,7 @@ TEST(SelectSchemaTest) {
|
||||
|
||||
TEST(SelectGroupDistinctTest) {
|
||||
TEST_PARSE_SINGLE_SQL("SELECT city, COUNT(name), COUNT(DISTINCT grade) FROM students GROUP BY city;", kStmtSelect,
|
||||
SelectStatement, result, stmt);
|
||||
SelectStatement, result, stmt);
|
||||
|
||||
ASSERT_FALSE(stmt->selectDistinct);
|
||||
ASSERT_EQ(stmt->selectList->size(), 3);
|
||||
@@ -173,7 +173,7 @@ TEST(SelectGroupDistinctTest) {
|
||||
|
||||
TEST(OrderByTest) {
|
||||
TEST_PARSE_SINGLE_SQL("SELECT grade, city FROM students ORDER BY grade, city DESC;", kStmtSelect, SelectStatement,
|
||||
result, stmt);
|
||||
result, stmt);
|
||||
|
||||
ASSERT_NULL(stmt->whereClause);
|
||||
ASSERT_NOTNULL(stmt->order);
|
||||
@@ -188,7 +188,7 @@ TEST(OrderByTest) {
|
||||
|
||||
TEST(SelectBetweenTest) {
|
||||
TEST_PARSE_SINGLE_SQL("SELECT grade, city FROM students WHERE grade BETWEEN 1 and c;", kStmtSelect, SelectStatement,
|
||||
result, stmt);
|
||||
result, stmt);
|
||||
|
||||
Expr* where = stmt->whereClause;
|
||||
ASSERT_NOTNULL(where);
|
||||
@@ -207,8 +207,8 @@ TEST(SelectBetweenTest) {
|
||||
|
||||
TEST(SelectConditionalSelectTest) {
|
||||
TEST_PARSE_SINGLE_SQL(
|
||||
"SELECT * FROM t WHERE a = (SELECT MIN(v) FROM tt) AND EXISTS (SELECT * FROM test WHERE x < a);", kStmtSelect,
|
||||
SelectStatement, result, stmt);
|
||||
"SELECT * FROM t WHERE a = (SELECT MIN(v) FROM tt) AND EXISTS (SELECT * FROM test WHERE x < a);", kStmtSelect,
|
||||
SelectStatement, result, stmt);
|
||||
|
||||
Expr* where = stmt->whereClause;
|
||||
ASSERT_NOTNULL(where);
|
||||
@@ -241,7 +241,7 @@ TEST(SelectConditionalSelectTest) {
|
||||
|
||||
TEST(SelectCaseWhen) {
|
||||
TEST_PARSE_SINGLE_SQL("SELECT MAX(CASE WHEN a = 'foo' THEN x ELSE 0 END) FROM test;", kStmtSelect, SelectStatement,
|
||||
result, stmt);
|
||||
result, stmt);
|
||||
|
||||
ASSERT_EQ(stmt->selectList->size(), 1);
|
||||
Expr* func = stmt->selectList->at(0);
|
||||
@@ -269,7 +269,7 @@ TEST(SelectCaseWhen) {
|
||||
|
||||
TEST(SelectCaseWhenWhen) {
|
||||
TEST_PARSE_SINGLE_SQL("SELECT CASE WHEN x = 1 THEN 1 WHEN 1.25 < x THEN 2 END FROM test;", kStmtSelect,
|
||||
SelectStatement, result, stmt);
|
||||
SelectStatement, result, stmt);
|
||||
|
||||
ASSERT_EQ(stmt->selectList->size(), 1);
|
||||
Expr* caseExpr = stmt->selectList->at(0);
|
||||
@@ -298,7 +298,7 @@ TEST(SelectCaseWhenWhen) {
|
||||
|
||||
TEST(SelectCaseValueWhenWhenElse) {
|
||||
TEST_PARSE_SINGLE_SQL("SELECT CASE x WHEN 1 THEN 0 WHEN 2 THEN 3 WHEN 8 THEN 7 ELSE 4 END FROM test;", kStmtSelect,
|
||||
SelectStatement, result, stmt);
|
||||
SelectStatement, result, stmt);
|
||||
|
||||
ASSERT_EQ(stmt->selectList->size(), 1);
|
||||
Expr* caseExpr = stmt->selectList->at(0);
|
||||
@@ -318,11 +318,11 @@ TEST(SelectCaseValueWhenWhenElse) {
|
||||
|
||||
TEST(SelectJoin) {
|
||||
TEST_PARSE_SINGLE_SQL(
|
||||
"SELECT City.name, Product.category, SUM(price) FROM fact\
|
||||
INNER JOIN City ON fact.city_id = City.id\
|
||||
OUTER JOIN Product ON fact.product_id = Product.id\
|
||||
GROUP BY City.name, Product.category;",
|
||||
kStmtSelect, SelectStatement, result, stmt);
|
||||
"SELECT City.name, Product.category, SUM(price) FROM fact\
|
||||
INNER JOIN City ON fact.city_id = City.id\
|
||||
OUTER JOIN Product ON fact.product_id = Product.id\
|
||||
GROUP BY City.name, Product.category;",
|
||||
kStmtSelect, SelectStatement, result, stmt);
|
||||
|
||||
const TableRef* table = stmt->fromTable;
|
||||
const JoinDefinition* outer_join = table->join;
|
||||
@@ -357,12 +357,12 @@ TEST(SelectJoin) {
|
||||
|
||||
TEST(SelectColumnOrder) {
|
||||
TEST_PARSE_SINGLE_SQL(
|
||||
"SELECT *\
|
||||
FROM a,\
|
||||
(SELECT a AS b FROM a) b,\
|
||||
(SELECT a AS c FROM a) c,\
|
||||
(SELECT a AS d FROM a) d;",
|
||||
kStmtSelect, SelectStatement, result, stmt);
|
||||
"SELECT *\
|
||||
FROM a,\
|
||||
(SELECT a AS b FROM a) b,\
|
||||
(SELECT a AS c FROM a) c,\
|
||||
(SELECT a AS d FROM a) d;",
|
||||
kStmtSelect, SelectStatement, result, stmt);
|
||||
|
||||
ASSERT_EQ(stmt->fromTable->list->size(), 4);
|
||||
|
||||
@@ -419,17 +419,17 @@ TEST(Operators) {
|
||||
SQLParserResult result;
|
||||
|
||||
SQLParser::parse(
|
||||
"SELECT * FROM foo where a = 1; \
|
||||
SELECT * FROM foo where a == 2; \
|
||||
SELECT * FROM foo where a != 1; \
|
||||
SELECT * FROM foo where a <> 1; \
|
||||
SELECT * FROM foo where a > 1; \
|
||||
SELECT * FROM foo where a < 1; \
|
||||
SELECT * FROM foo where a >= 1; \
|
||||
SELECT * FROM foo where a <= 1; \
|
||||
SELECT * FROM foo where a = TRUE; \
|
||||
SELECT * FROM foo where a = false;",
|
||||
&result);
|
||||
"SELECT * FROM foo where a = 1; \
|
||||
SELECT * FROM foo where a == 2; \
|
||||
SELECT * FROM foo where a != 1; \
|
||||
SELECT * FROM foo where a <> 1; \
|
||||
SELECT * FROM foo where a > 1; \
|
||||
SELECT * FROM foo where a < 1; \
|
||||
SELECT * FROM foo where a >= 1; \
|
||||
SELECT * FROM foo where a <= 1; \
|
||||
SELECT * FROM foo where a = TRUE; \
|
||||
SELECT * FROM foo where a = false;",
|
||||
&result);
|
||||
|
||||
stmt = (SelectStatement*)result.getStatement(0);
|
||||
ASSERT_EQ(stmt->whereClause->opType, kOpEquals);
|
||||
@@ -474,19 +474,19 @@ TEST(JoinTypes) {
|
||||
SQLParserResult result;
|
||||
|
||||
SQLParser::parse(
|
||||
"SELECT * FROM x join y on a=b; \
|
||||
SELECT * FROM x inner join y on a=b; \
|
||||
SELECT * FROM x left join y on a=b; \
|
||||
SELECT * FROM x left outer join y on a=b; \
|
||||
SELECT * FROM x right join y on a=b; \
|
||||
SELECT * FROM x right outer join y on a=b; \
|
||||
SELECT * FROM x full join y on a=b; \
|
||||
SELECT * FROM x outer join y on a=b; \
|
||||
SELECT * FROM x full outer join y on a=b; \
|
||||
SELECT * FROM x natural join y; \
|
||||
SELECT * FROM x cross join y on a=b; \
|
||||
SELECT * FROM x, y where a = b;",
|
||||
&result);
|
||||
"SELECT * FROM x join y on a=b; \
|
||||
SELECT * FROM x inner join y on a=b; \
|
||||
SELECT * FROM x left join y on a=b; \
|
||||
SELECT * FROM x left outer join y on a=b; \
|
||||
SELECT * FROM x right join y on a=b; \
|
||||
SELECT * FROM x right outer join y on a=b; \
|
||||
SELECT * FROM x full join y on a=b; \
|
||||
SELECT * FROM x outer join y on a=b; \
|
||||
SELECT * FROM x full outer join y on a=b; \
|
||||
SELECT * FROM x natural join y; \
|
||||
SELECT * FROM x cross join y on a=b; \
|
||||
SELECT * FROM x, y where a = b;",
|
||||
&result);
|
||||
|
||||
stmt = (SelectStatement*)result.getStatement(0);
|
||||
ASSERT_EQ(stmt->fromTable->join->type, kJoinInner);
|
||||
@@ -529,21 +529,21 @@ TEST(SetLimitOffset) {
|
||||
SelectStatement* stmt;
|
||||
|
||||
TEST_PARSE_SQL_QUERY(
|
||||
"select a from t1 limit 1; \
|
||||
select a from t1 limit 1 + 2; \
|
||||
select a from t1 offset 1; \
|
||||
select a from t1 offset 1 + 2; \
|
||||
select a from t1 limit 1 offset 1; \
|
||||
select a from t1 limit 1 + 2 offset 1 + 2; \
|
||||
select a from t1 limit 1 offset NULL; \
|
||||
select a from t1 limit ALL; \
|
||||
select a from t1 limit NULL; \
|
||||
select a from t1 limit ALL offset 1; \
|
||||
select a from t1 limit NULL offset 1; \
|
||||
select top 10 a from t1; \
|
||||
select top 20 a from t1 limit 10; \
|
||||
select a from t1 limit (SELECT MAX(b) FROM t1) offset (SELECT MIN(b) FROM t1);",
|
||||
result, 14);
|
||||
"select a from t1 limit 1; \
|
||||
select a from t1 limit 1 + 2; \
|
||||
select a from t1 offset 1; \
|
||||
select a from t1 offset 1 + 2; \
|
||||
select a from t1 limit 1 offset 1; \
|
||||
select a from t1 limit 1 + 2 offset 1 + 2; \
|
||||
select a from t1 limit 1 offset NULL; \
|
||||
select a from t1 limit ALL; \
|
||||
select a from t1 limit NULL; \
|
||||
select a from t1 limit ALL offset 1; \
|
||||
select a from t1 limit NULL offset 1; \
|
||||
select top 10 a from t1; \
|
||||
select top 20 a from t1 limit 10; \
|
||||
select a from t1 limit (SELECT MAX(b) FROM t1) offset (SELECT MIN(b) FROM t1);",
|
||||
result, 14);
|
||||
|
||||
stmt = (SelectStatement*)result.getStatement(0);
|
||||
ASSERT_EQ(stmt->limit->limit->type, kExprLiteralInt);
|
||||
@@ -627,10 +627,10 @@ TEST(Extract) {
|
||||
SelectStatement* stmt;
|
||||
|
||||
TEST_PARSE_SQL_QUERY(
|
||||
"select extract(year from dc) FROM t;"
|
||||
"select x, extract(month from dc) AS t FROM t;"
|
||||
"select x FROM t WHERE extract(minute from dc) > 2011;",
|
||||
result, 3);
|
||||
"select extract(year from dc) FROM t;"
|
||||
"select x, extract(month from dc) AS t FROM t;"
|
||||
"select x FROM t WHERE extract(minute from dc) > 2011;",
|
||||
result, 3);
|
||||
|
||||
stmt = (SelectStatement*)result.getStatement(0);
|
||||
ASSERT_TRUE(stmt->selectList);
|
||||
@@ -687,10 +687,10 @@ TEST(NoFromClause) {
|
||||
|
||||
TEST(WithClauseSingle) {
|
||||
TEST_PARSE_SINGLE_SQL(
|
||||
"WITH "
|
||||
"a AS (SELECT name FROM peopleA)"
|
||||
"SELECT name FROM a;",
|
||||
kStmtSelect, SelectStatement, result, stmt)
|
||||
"WITH "
|
||||
"a AS (SELECT name FROM peopleA)"
|
||||
"SELECT name FROM a;",
|
||||
kStmtSelect, SelectStatement, result, stmt)
|
||||
|
||||
// with_description_list – count
|
||||
ASSERT_EQ(stmt->withDescriptions->size(), 1);
|
||||
@@ -711,11 +711,11 @@ TEST(WithClauseSingle) {
|
||||
|
||||
TEST(WithClauseDouble) {
|
||||
TEST_PARSE_SINGLE_SQL(
|
||||
"WITH "
|
||||
"a AS (SELECT nameA FROM peopleA), "
|
||||
"b AS (SELECT nameB, cityB FROM peopleB) "
|
||||
"SELECT nameA FROM a;",
|
||||
kStmtSelect, SelectStatement, result, stmt)
|
||||
"WITH "
|
||||
"a AS (SELECT nameA FROM peopleA), "
|
||||
"b AS (SELECT nameB, cityB FROM peopleB) "
|
||||
"SELECT nameA FROM a;",
|
||||
kStmtSelect, SelectStatement, result, stmt)
|
||||
|
||||
// with_description_list – count
|
||||
ASSERT_EQ(stmt->withDescriptions->size(), 2);
|
||||
@@ -757,9 +757,9 @@ TEST(IntervalLiteral) {
|
||||
SelectStatement* stmt;
|
||||
Expr* interval_literal;
|
||||
TEST_PARSE_SQL_QUERY(
|
||||
"SELECT a + 1 year FROM t;"
|
||||
"SELECT * FROM t where a = cast ('2000-01-01' AS DATE) - 30 days;",
|
||||
result, 2);
|
||||
"SELECT a + 1 year FROM t;"
|
||||
"SELECT * FROM t where a = cast ('2000-01-01' AS DATE) - 30 days;",
|
||||
result, 2);
|
||||
|
||||
stmt = (SelectStatement*)result.getStatement(0);
|
||||
ASSERT_TRUE(stmt->selectList);
|
||||
@@ -786,44 +786,44 @@ TEST(IntervalLiteral) {
|
||||
ASSERT_EQ(interval_literal->type, kExprLiteralInterval);
|
||||
|
||||
const auto interval_units = std::map<DatetimeField, std::string>{
|
||||
{kDatetimeSecond, "second"}, {kDatetimeMinute, "minute"}, {kDatetimeHour, "hour"},
|
||||
{kDatetimeDay, "day"}, {kDatetimeMonth, "month"}, {kDatetimeYear, "year"}};
|
||||
{kDatetimeSecond, "second"}, {kDatetimeMinute, "minute"}, {kDatetimeHour, "hour"},
|
||||
{kDatetimeDay, "day"}, {kDatetimeMonth, "month"}, {kDatetimeYear, "year"}};
|
||||
|
||||
for (const auto& it : interval_units) {
|
||||
const auto& unit_string = it.second;
|
||||
const auto unit_string_plural = unit_string + "s";
|
||||
TEST_PARSE_SQL_QUERY("SELECT * FROM t WHERE a = 1 + 5 " + unit_string +
|
||||
";"
|
||||
"SELECT * FROM t WHERE a = 1 + 5 " +
|
||||
unit_string_plural +
|
||||
";"
|
||||
"SELECT * FROM t WHERE a = 1 + INTERVAL '5'" +
|
||||
unit_string +
|
||||
";"
|
||||
"SELECT * FROM t WHERE a = 1 + INTERVAL '5 " +
|
||||
unit_string +
|
||||
"';"
|
||||
"SELECT * FROM t WHERE a = 1 + INTERVAL '5 " +
|
||||
unit_string_plural + "';",
|
||||
result, 5);
|
||||
const auto& unit_string = it.second;
|
||||
const auto unit_string_plural = unit_string + "s";
|
||||
TEST_PARSE_SQL_QUERY("SELECT * FROM t WHERE a = 1 + 5 " + unit_string +
|
||||
";"
|
||||
"SELECT * FROM t WHERE a = 1 + 5 " +
|
||||
unit_string_plural +
|
||||
";"
|
||||
"SELECT * FROM t WHERE a = 1 + INTERVAL '5'" +
|
||||
unit_string +
|
||||
";"
|
||||
"SELECT * FROM t WHERE a = 1 + INTERVAL '5 " +
|
||||
unit_string +
|
||||
"';"
|
||||
"SELECT * FROM t WHERE a = 1 + INTERVAL '5 " +
|
||||
unit_string_plural + "';",
|
||||
result, 5);
|
||||
|
||||
for (const auto& statement : result.getStatements()) {
|
||||
stmt = (SelectStatement*)statement;
|
||||
interval_literal = stmt->whereClause->expr2->expr2;
|
||||
ASSERT_EQ(interval_literal->datetimeField, it.first);
|
||||
ASSERT_EQ(interval_literal->ival, 5);
|
||||
ASSERT_EQ(interval_literal->type, kExprLiteralInterval);
|
||||
}
|
||||
for (const auto& statement : result.getStatements()) {
|
||||
stmt = (SelectStatement*)statement;
|
||||
interval_literal = stmt->whereClause->expr2->expr2;
|
||||
ASSERT_EQ(interval_literal->datetimeField, it.first);
|
||||
ASSERT_EQ(interval_literal->ival, 5);
|
||||
ASSERT_EQ(interval_literal->type, kExprLiteralInterval);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(LockingClauseWithoutWaitPolicy) {
|
||||
SelectStatement* stmt;
|
||||
TEST_PARSE_SQL_QUERY(
|
||||
"SELECT * FROM t WHERE a = 10 FOR UPDATE;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR SHARE;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR NO KEY UPDATE FOR KEY SHARE;",
|
||||
result, 3);
|
||||
"SELECT * FROM t WHERE a = 10 FOR UPDATE;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR SHARE;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR NO KEY UPDATE FOR KEY SHARE;",
|
||||
result, 3);
|
||||
|
||||
stmt = (SelectStatement*)result.getStatement(0);
|
||||
ASSERT_EQ(stmt->lockings->size(), 1);
|
||||
@@ -850,15 +850,15 @@ TEST(LockingClauseWithoutWaitPolicy) {
|
||||
TEST(LockingClauseWithWaitPolicy) {
|
||||
SelectStatement* stmt;
|
||||
TEST_PARSE_SQL_QUERY(
|
||||
"SELECT * FROM t WHERE a = 10 FOR UPDATE NOWAIT;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR SHARE NOWAIT;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR NO KEY UPDATE NOWAIT;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR KEY SHARE NOWAIT;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR UPDATE SKIP LOCKED;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR SHARE SKIP LOCKED;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR NO KEY UPDATE SKIP LOCKED;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR KEY SHARE SKIP LOCKED;",
|
||||
result, 8);
|
||||
"SELECT * FROM t WHERE a = 10 FOR UPDATE NOWAIT;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR SHARE NOWAIT;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR NO KEY UPDATE NOWAIT;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR KEY SHARE NOWAIT;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR UPDATE SKIP LOCKED;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR SHARE SKIP LOCKED;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR NO KEY UPDATE SKIP LOCKED;"
|
||||
"SELECT * FROM t WHERE a = 10 FOR KEY SHARE SKIP LOCKED;",
|
||||
result, 8);
|
||||
|
||||
stmt = (SelectStatement*)result.getStatement(0);
|
||||
ASSERT_EQ(stmt->lockings->size(), 1);
|
||||
@@ -912,10 +912,10 @@ TEST(LockingClauseWithWaitPolicy) {
|
||||
TEST(LockingClauseWithTableReference) {
|
||||
SelectStatement* stmt;
|
||||
TEST_PARSE_SQL_QUERY(
|
||||
"SELECT * FROM t WHERE a = 10 FOR UPDATE OF t;"
|
||||
"SELECT * FROM t, c WHERE t.a = 10 FOR SHARE OF t,c;"
|
||||
"SELECT * FROM t, c WHERE t.a = 10 FOR NO KEY UPDATE OF t,c NOWAIT;",
|
||||
result, 3);
|
||||
"SELECT * FROM t WHERE a = 10 FOR UPDATE OF t;"
|
||||
"SELECT * FROM t, c WHERE t.a = 10 FOR SHARE OF t,c;"
|
||||
"SELECT * FROM t, c WHERE t.a = 10 FOR NO KEY UPDATE OF t,c NOWAIT;",
|
||||
result, 3);
|
||||
|
||||
stmt = (SelectStatement*)result.getStatement(0);
|
||||
ASSERT_EQ(stmt->lockings->size(), 1);
|
||||
@@ -944,10 +944,10 @@ TEST(LockingClauseWithTableReference) {
|
||||
TEST(MultipleLockingClause) {
|
||||
SelectStatement* stmt;
|
||||
TEST_PARSE_SQL_QUERY(
|
||||
"SELECT * FROM t, c WHERE t.a = 10 FOR NO KEY UPDATE OF t FOR KEY SHARE OF c;"
|
||||
"SELECT * FROM t, c WHERE t.a = 10 FOR SHARE OF t SKIP LOCKED FOR UPDATE OF c NOWAIT;"
|
||||
"SELECT * FROM t, c, s WHERE t.a = 10 FOR NO KEY UPDATE FOR SHARE OF t SKIP LOCKED FOR UPDATE OF c, s NOWAIT;",
|
||||
result, 3);
|
||||
"SELECT * FROM t, c WHERE t.a = 10 FOR NO KEY UPDATE OF t FOR KEY SHARE OF c;"
|
||||
"SELECT * FROM t, c WHERE t.a = 10 FOR SHARE OF t SKIP LOCKED FOR UPDATE OF c NOWAIT;"
|
||||
"SELECT * FROM t, c, s WHERE t.a = 10 FOR NO KEY UPDATE FOR SHARE OF t SKIP LOCKED FOR UPDATE OF c, s NOWAIT;",
|
||||
result, 3);
|
||||
|
||||
stmt = (SelectStatement*)result.getStatement(0);
|
||||
ASSERT_EQ(stmt->lockings->size(), 2);
|
||||
@@ -992,13 +992,13 @@ TEST(MultipleLockingClause) {
|
||||
TEST(WindowFunctions) {
|
||||
SelectStatement* stmt;
|
||||
TEST_PARSE_SQL_QUERY(
|
||||
"SELECT t2, 1 / avg(t1) OVER(), rank() OVER(ORDER BY t1 DESC) rnk FROM t;"
|
||||
"SELECT avg(t1) OVER(PARTITION BY t2, t3 ORDER BY t4, t5 ROWS UNBOUNDED PRECEDING) FROM t;"
|
||||
"SELECT rank() OVER(PARTITION BY t1 ORDER BY t2 ROWS BETWEEN 25 PRECEDING AND 2 FOLLOWING) FROM t;"
|
||||
"SELECT rank() OVER(PARTITION BY t1 ORDER BY t2 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM "
|
||||
"t;"
|
||||
"SELECT rank() OVER(PARTITION BY t1 ORDER BY t2 GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t;",
|
||||
result, 5);
|
||||
"SELECT t2, 1 / avg(t1) OVER(), rank() OVER(ORDER BY t1 DESC) rnk FROM t;"
|
||||
"SELECT avg(t1) OVER(PARTITION BY t2, t3 ORDER BY t4, t5 ROWS UNBOUNDED PRECEDING) FROM t;"
|
||||
"SELECT rank() OVER(PARTITION BY t1 ORDER BY t2 ROWS BETWEEN 25 PRECEDING AND 2 FOLLOWING) FROM t;"
|
||||
"SELECT rank() OVER(PARTITION BY t1 ORDER BY t2 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM "
|
||||
"t;"
|
||||
"SELECT rank() OVER(PARTITION BY t1 ORDER BY t2 GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t;",
|
||||
result, 5);
|
||||
|
||||
stmt = (SelectStatement*)result.getStatement(0);
|
||||
ASSERT_TRUE(stmt->selectList);
|
||||
@@ -1094,45 +1094,45 @@ TEST(WindowFunctions) {
|
||||
ASSERT_FALSE(stmt->selectList->at(0)->windowDescription->frameDescription->end->unbounded);
|
||||
|
||||
const auto frame_starts =
|
||||
std::vector<FrameBound>{{25, kPreceding, false}, {0, kPreceding, true}, {0, kPreceding, true}};
|
||||
std::vector<FrameBound>{{25, kPreceding, false}, {0, kPreceding, true}, {0, kPreceding, true}};
|
||||
const auto frame_ends =
|
||||
std::vector<FrameBound>{{2, kFollowing, false}, {0, kFollowing, true}, {0, kCurrentRow, false}};
|
||||
std::vector<FrameBound>{{2, kFollowing, false}, {0, kFollowing, true}, {0, kCurrentRow, false}};
|
||||
|
||||
for (auto bound_index = size_t{0}; bound_index < frame_starts.size(); ++bound_index) {
|
||||
stmt = (SelectStatement*)result.getStatement(2 + bound_index);
|
||||
const auto& expected_start = frame_starts[bound_index];
|
||||
const auto& expected_end = frame_ends[bound_index];
|
||||
stmt = (SelectStatement*)result.getStatement(2 + bound_index);
|
||||
const auto& expected_start = frame_starts[bound_index];
|
||||
const auto& expected_end = frame_ends[bound_index];
|
||||
|
||||
ASSERT_TRUE(stmt->selectList);
|
||||
ASSERT_EQ(stmt->selectList->size(), 1);
|
||||
ASSERT_TRUE(stmt->fromTable);
|
||||
ASSERT_EQ(stmt->fromTable->type, kTableName);
|
||||
ASSERT_STREQ(stmt->fromTable->name, "t");
|
||||
ASSERT_TRUE(stmt->selectList);
|
||||
ASSERT_EQ(stmt->selectList->size(), 1);
|
||||
ASSERT_TRUE(stmt->fromTable);
|
||||
ASSERT_EQ(stmt->fromTable->type, kTableName);
|
||||
ASSERT_STREQ(stmt->fromTable->name, "t");
|
||||
|
||||
ASSERT_EQ(stmt->selectList->at(0)->type, kExprFunctionRef);
|
||||
ASSERT_STREQ(stmt->selectList->at(0)->name, "rank");
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->exprList->empty());
|
||||
ASSERT_EQ(stmt->selectList->at(0)->type, kExprFunctionRef);
|
||||
ASSERT_STREQ(stmt->selectList->at(0)->name, "rank");
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->exprList->empty());
|
||||
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->windowDescription);
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->partitionList);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->partitionList->size(), 1);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->partitionList->at(0)->type, kExprColumnRef);
|
||||
ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->partitionList->at(0)->name, "t1");
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->windowDescription);
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->partitionList);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->partitionList->size(), 1);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->partitionList->at(0)->type, kExprColumnRef);
|
||||
ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->partitionList->at(0)->name, "t1");
|
||||
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->orderList);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->size(), 1);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->type, kOrderAsc);
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr->type, kExprColumnRef);
|
||||
ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr->name, "t2");
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription);
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription->start);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->offset, expected_start.offset);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->type, expected_start.type);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->unbounded, expected_start.unbounded);
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription->end);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->offset, expected_end.offset);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->type, expected_end.type);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->unbounded, expected_end.unbounded);
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->orderList);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->size(), 1);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->type, kOrderAsc);
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr->type, kExprColumnRef);
|
||||
ASSERT_STREQ(stmt->selectList->at(0)->windowDescription->orderList->at(0)->expr->name, "t2");
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription);
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription->start);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->offset, expected_start.offset);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->type, expected_start.type);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->start->unbounded, expected_start.unbounded);
|
||||
ASSERT_TRUE(stmt->selectList->at(0)->windowDescription->frameDescription->end);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->offset, expected_end.offset);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->type, expected_end.type);
|
||||
ASSERT_EQ(stmt->selectList->at(0)->windowDescription->frameDescription->end->unbounded, expected_end.unbounded);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user