2014-10-09 01:30:22 +02:00
/*
* sql_tests . cpp
*/
2017-02-10 21:41:34 +01:00
# include "thirdparty/microtest/microtest.h"
2017-04-07 15:47:51 +02:00
2014-10-16 15:54:51 +02:00
# include "SQLParser.h"
2017-04-07 15:47:51 +02:00
# include "util/sqlhelper.h"
# include "sql_asserts.h"
2014-12-02 01:27:02 +01:00
2014-11-26 16:20:55 +01:00
using namespace hsql ;
2014-10-09 01:30:22 +02:00
2014-12-15 16:43:32 +01:00
TEST ( DeleteStatementTest ) {
2017-04-07 16:26:00 +02:00
SQLParserResult result ;
2017-07-21 02:47:45 +02:00
SQLParser : : parse ( " DELETE FROM students WHERE grade > 2.0; " , & result ) ;
2017-03-07 02:01:00 +01:00
2017-04-07 16:26:00 +02:00
ASSERT ( result . isValid ( ) ) ;
ASSERT_EQ ( result . size ( ) , 1 ) ;
ASSERT ( result . getStatement ( 0 ) - > type ( ) = = kStmtDelete ) ;
const DeleteStatement * stmt = ( const DeleteStatement * ) result . getStatement ( 0 ) ;
2017-03-07 02:01:00 +01:00
ASSERT_STREQ ( stmt - > tableName , " students " ) ;
ASSERT_NOTNULL ( stmt - > expr ) ;
ASSERT ( stmt - > expr - > isType ( kExprOperator ) ) ;
ASSERT_STREQ ( stmt - > expr - > expr - > name , " grade " ) ;
ASSERT_EQ ( stmt - > expr - > expr2 - > fval , 2.0 ) ;
2014-10-09 01:30:22 +02:00
}
2014-12-15 16:43:32 +01:00
TEST ( CreateStatementTest ) {
2017-04-07 16:26:00 +02:00
SQLParserResult result ;
2018-10-19 14:18:03 +02:00
SQLParser : : parse ( " CREATE TABLE students (name VARCHAR(50), student_number INT, city INTEGER NULL, grade DOUBLE NOT NULL, comment TEXT) " , & result ) ;
2017-04-07 16:26:00 +02:00
ASSERT ( result . isValid ( ) ) ;
ASSERT_EQ ( result . size ( ) , 1 ) ;
ASSERT_EQ ( result . getStatement ( 0 ) - > type ( ) , kStmtCreate ) ;
2017-03-07 02:01:00 +01:00
2017-04-07 16:26:00 +02:00
const CreateStatement * stmt = ( const CreateStatement * ) result . getStatement ( 0 ) ;
2017-04-21 16:15:07 +02:00
ASSERT_EQ ( stmt - > type , kCreateTable ) ;
2017-03-07 02:01:00 +01:00
ASSERT_STREQ ( stmt - > tableName , " students " ) ;
ASSERT_NOTNULL ( stmt - > columns ) ;
2018-10-19 14:18:03 +02:00
ASSERT_EQ ( stmt - > columns - > size ( ) , 5 ) ;
2017-03-07 02:01:00 +01:00
ASSERT_STREQ ( stmt - > columns - > at ( 0 ) - > name , " name " ) ;
ASSERT_STREQ ( stmt - > columns - > at ( 1 ) - > name , " student_number " ) ;
ASSERT_STREQ ( stmt - > columns - > at ( 2 ) - > name , " city " ) ;
ASSERT_STREQ ( stmt - > columns - > at ( 3 ) - > name , " grade " ) ;
2018-10-19 14:18:03 +02:00
ASSERT_STREQ ( stmt - > columns - > at ( 4 ) - > name , " comment " ) ;
ASSERT_EQ ( stmt - > columns - > at ( 0 ) - > type , ( ColumnType { DataType : : VARCHAR , 50 } ) ) ;
ASSERT_EQ ( stmt - > columns - > at ( 1 ) - > type , ColumnType { DataType : : INT } ) ;
ASSERT_EQ ( stmt - > columns - > at ( 2 ) - > type , ColumnType { DataType : : INT } ) ;
ASSERT_EQ ( stmt - > columns - > at ( 3 ) - > type , ColumnType { DataType : : DOUBLE } ) ;
ASSERT_EQ ( stmt - > columns - > at ( 4 ) - > type , ColumnType { DataType : : TEXT } ) ;
ASSERT_EQ ( stmt - > columns - > at ( 0 ) - > nullable , false ) ;
ASSERT_EQ ( stmt - > columns - > at ( 1 ) - > nullable , false ) ;
ASSERT_EQ ( stmt - > columns - > at ( 2 ) - > nullable , true ) ;
ASSERT_EQ ( stmt - > columns - > at ( 3 ) - > nullable , false ) ;
2020-05-25 22:04:39 +02:00
ASSERT_EQ ( stmt - > columns - > at ( 4 ) - > nullable , false ) ;
2014-12-02 01:27:02 +01:00
}
2019-06-07 11:42:49 +02:00
TEST ( CreateAsSelectStatementTest ) {
SQLParserResult result ;
SQLParser : : parse ( " CREATE TABLE students_2 AS SELECT student_number, grade FROM students " , & result ) ;
ASSERT ( result . isValid ( ) ) ;
ASSERT_EQ ( result . size ( ) , 1 ) ;
ASSERT_EQ ( result . getStatement ( 0 ) - > type ( ) , kStmtCreate ) ;
const CreateStatement * stmt = ( const CreateStatement * ) result . getStatement ( 0 ) ;
ASSERT_EQ ( stmt - > type , kCreateTable ) ;
ASSERT_STREQ ( stmt - > tableName , " students_2 " ) ;
ASSERT_NULL ( stmt - > columns ) ;
ASSERT_NOTNULL ( stmt - > select ) ;
ASSERT ( stmt - > select - > selectList - > at ( 0 ) - > isType ( kExprColumnRef ) ) ;
ASSERT_STREQ ( stmt - > select - > selectList - > at ( 0 ) - > getName ( ) , " student_number " ) ;
ASSERT ( stmt - > select - > selectList - > at ( 1 ) - > isType ( kExprColumnRef ) ) ;
ASSERT_STREQ ( stmt - > select - > selectList - > at ( 1 ) - > getName ( ) , " grade " ) ;
}
2014-12-02 01:27:02 +01:00
2014-12-15 16:43:32 +01:00
TEST ( UpdateStatementTest ) {
2017-04-07 16:26:00 +02:00
SQLParserResult result ;
2018-11-12 15:35:31 +01:00
SQLParser : : parse ( " UPDATE students SET grade = 5.0, name = 'test' WHERE name = 'Max O''Mustermann'; " , & result ) ;
2017-04-07 16:26:00 +02:00
ASSERT ( result . isValid ( ) ) ;
ASSERT_EQ ( result . size ( ) , 1 ) ;
ASSERT_EQ ( result . getStatement ( 0 ) - > type ( ) , kStmtUpdate ) ;
2017-03-07 02:01:00 +01:00
2017-04-07 16:26:00 +02:00
const UpdateStatement * stmt = ( const UpdateStatement * ) result . getStatement ( 0 ) ;
2017-03-07 02:01:00 +01:00
ASSERT_NOTNULL ( stmt - > table ) ;
ASSERT_STREQ ( stmt - > table - > name , " students " ) ;
ASSERT_NOTNULL ( stmt - > updates ) ;
ASSERT_EQ ( stmt - > updates - > size ( ) , 2 ) ;
ASSERT_STREQ ( stmt - > updates - > at ( 0 ) - > column , " grade " ) ;
ASSERT_STREQ ( stmt - > updates - > at ( 1 ) - > column , " name " ) ;
ASSERT ( stmt - > updates - > at ( 0 ) - > value - > isType ( kExprLiteralFloat ) ) ;
ASSERT ( stmt - > updates - > at ( 1 ) - > value - > isType ( kExprLiteralString ) ) ;
ASSERT_EQ ( stmt - > updates - > at ( 0 ) - > value - > fval , 5.0 ) ;
ASSERT_STREQ ( stmt - > updates - > at ( 1 ) - > value - > name , " test " ) ;
ASSERT_NOTNULL ( stmt - > where ) ;
ASSERT ( stmt - > where - > isType ( kExprOperator ) ) ;
2017-06-29 13:40:24 +02:00
ASSERT_EQ ( stmt - > where - > opType , kOpEquals ) ;
2017-03-07 02:01:00 +01:00
ASSERT_STREQ ( stmt - > where - > expr - > name , " name " ) ;
2018-11-12 15:35:31 +01:00
ASSERT_STREQ ( stmt - > where - > expr2 - > name , " Max O'Mustermann " ) ;
2014-12-02 01:27:02 +01:00
}
2014-12-15 16:43:32 +01:00
TEST ( InsertStatementTest ) {
2017-03-07 02:01:00 +01:00
TEST_PARSE_SINGLE_SQL (
" INSERT INTO students VALUES ('Max Mustermann', 12345, 'Musterhausen', 2.0) " ,
kStmtInsert ,
InsertStatement ,
result ,
stmt ) ;
2014-12-02 01:27:02 +01:00
2017-03-07 02:01:00 +01:00
ASSERT_EQ ( stmt - > values - > size ( ) , 4 ) ;
// TODO
2014-12-03 16:53:49 +01:00
}
2014-12-15 16:43:32 +01:00
TEST ( DropTableStatementTest ) {
2017-03-07 02:01:00 +01:00
TEST_PARSE_SINGLE_SQL (
" DROP TABLE students " ,
kStmtDrop ,
DropStatement ,
result ,
stmt ) ;
2017-10-12 20:19:59 +02:00
ASSERT_FALSE ( s tmt - > ifExists ) ;
ASSERT_EQ ( stmt - > type , kDropTable ) ;
ASSERT_NOTNULL ( stmt - > name ) ;
ASSERT_STREQ ( stmt - > name , " students " ) ;
}
TEST ( DropTableIfExistsStatementTest ) {
TEST_PARSE_SINGLE_SQL (
" DROP TABLE IF EXISTS students " ,
kStmtDrop ,
DropStatement ,
result ,
stmt ) ;
ASSERT_TRUE ( stmt - > ifExists ) ;
2017-04-21 16:15:07 +02:00
ASSERT_EQ ( stmt - > type , kDropTable ) ;
2017-03-07 02:01:00 +01:00
ASSERT_NOTNULL ( stmt - > name ) ;
ASSERT_STREQ ( stmt - > name , " students " ) ;
2014-12-15 16:43:32 +01:00
}
2017-04-08 02:37:30 +02:00
TEST ( ReleaseStatementTest ) {
TEST_PARSE_SINGLE_SQL (
" SELECT * FROM students; " ,
kStmtSelect ,
SelectStatement ,
result ,
stmt ) ;
ASSERT_EQ ( 1 , result . size ( ) ) ;
ASSERT_NULL ( stmt - > whereClause ) ;
std : : vector < SQLStatement * > statements = result . releaseStatements ( ) ;
ASSERT_EQ ( 0 , result . size ( ) ) ;
for ( SQLStatement * stmt : statements ) {
delete stmt ;
}
}
2017-08-23 23:09:02 +02:00
TEST ( ShowTableStatementTest ) {
TEST_PARSE_SINGLE_SQL (
" SHOW TABLES; " ,
kStmtShow ,
ShowStatement ,
result ,
stmt ) ;
ASSERT_EQ ( stmt - > type , kShowTables ) ;
ASSERT_NULL ( stmt - > name ) ;
}
TEST ( ShowColumnsStatementTest ) {
TEST_PARSE_SINGLE_SQL (
" SHOW COLUMNS students; " ,
kStmtShow ,
ShowStatement ,
result ,
stmt ) ;
ASSERT_EQ ( stmt - > type , kShowColumns ) ;
ASSERT_NOTNULL ( stmt - > name ) ;
ASSERT_STREQ ( stmt - > name , " students " ) ;
}
2019-09-16 11:58:05 +02:00
TEST ( DescribeStatementTest ) {
TEST_PARSE_SINGLE_SQL (
" DESCRIBE students; " ,
kStmtShow ,
ShowStatement ,
result ,
stmt ) ;
ASSERT_EQ ( stmt - > type , kShowColumns ) ;
ASSERT_NOTNULL ( stmt - > name ) ;
ASSERT_STREQ ( stmt - > name , " students " ) ;
}
2020-01-08 16:21:02 +01:00
TEST ( ImportStatementTest ) {
TEST_PARSE_SINGLE_SQL (
" IMPORT FROM TBL FILE 'students_file' INTO students; " ,
kStmtImport ,
ImportStatement ,
result ,
stmt ) ;
ASSERT_EQ ( stmt - > type , kImportTbl ) ;
ASSERT_NOTNULL ( stmt - > tableName ) ;
ASSERT_STREQ ( stmt - > tableName , " students " ) ;
ASSERT_STREQ ( stmt - > filePath , " students_file " ) ;
}
TEST ( CopyStatementTest ) {
TEST_PARSE_SINGLE_SQL (
" COPY students FROM 'students_file' ; " ,
kStmtImport ,
ImportStatement ,
import_result ,
import_stmt ) ;
ASSERT_EQ ( import_stmt - > type , kImportAuto ) ;
ASSERT_NOTNULL ( import_stmt - > tableName ) ;
ASSERT_STREQ ( import_stmt - > tableName , " students " ) ;
ASSERT_STREQ ( import_stmt - > filePath , " students_file " ) ;
TEST_PARSE_SINGLE_SQL (
" COPY students TO 'students_file'; " ,
kStmtExport ,
ExportStatement ,
export_result ,
export_stmt ) ;
ASSERT_EQ ( export_stmt - > type , kImportAuto ) ;
ASSERT_NOTNULL ( export_stmt - > tableName ) ;
ASSERT_STREQ ( export_stmt - > tableName , " students " ) ;
ASSERT_STREQ ( export_stmt - > filePath , " students_file " ) ;
}
2017-04-21 16:15:07 +02:00
SQLParserResult parse_and_move ( std : : string query ) {
hsql : : SQLParserResult result ;
2017-07-21 02:47:45 +02:00
hsql : : SQLParser : : parse ( query , & result ) ;
2017-04-21 16:15:07 +02:00
// Moves on return.
return result ;
}
SQLParserResult move_in_and_back ( SQLParserResult res ) {
// Moves on return.
return res ;
}
TEST ( MoveSQLResultTest ) {
SQLParserResult res = parse_and_move ( " SELECT * FROM test; " ) ;
ASSERT ( res . isValid ( ) ) ;
ASSERT_EQ ( 1 , res . size ( ) ) ;
// Moved around.
SQLParserResult new_res = move_in_and_back ( std : : move ( res ) ) ;
// Original object should be invalid.
ASSERT_FALSE ( res . isValid ( ) ) ;
ASSERT_EQ ( 0 , res . size ( ) ) ;
ASSERT ( new_res . isValid ( ) ) ;
ASSERT_EQ ( 1 , new_res . size ( ) ) ;
}
2017-06-06 03:49:41 +02:00
TEST ( HintTest ) {
TEST_PARSE_SINGLE_SQL (
" SELECT * FROM students WITH HINT(NO_CACHE, SAMPLE_RATE(10)); " ,
kStmtSelect ,
SelectStatement ,
result ,
stmt ) ;
ASSERT_NOTNULL ( stmt - > hints ) ;
ASSERT_EQ ( 2 , stmt - > hints - > size ( ) ) ;
ASSERT_STREQ ( " NO_CACHE " , stmt - > hints - > at ( 0 ) - > name ) ;
ASSERT_STREQ ( " SAMPLE_RATE " , stmt - > hints - > at ( 1 ) - > name ) ;
ASSERT_EQ ( 1 , stmt - > hints - > at ( 1 ) - > exprList - > size ( ) ) ;
ASSERT_EQ ( 10 , stmt - > hints - > at ( 1 ) - > exprList - > at ( 0 ) - > ival ) ;
}
2018-01-17 15:43:38 +01:00
TEST ( StringLengthTest ) {
TEST_PARSE_SQL_QUERY (
" SELECT * FROM bar; INSERT INTO foo VALUES (4); \t \n SELECT * FROM foo; " ,
result ,
3 ) ;
ASSERT_EQ ( result . getStatement ( 0 ) - > stringLength , 18 ) ;
ASSERT_EQ ( result . getStatement ( 1 ) - > stringLength , 28 ) ;
ASSERT_EQ ( result . getStatement ( 2 ) - > stringLength , 21 ) ;
2020-02-18 14:26:10 +01:00
}
TEST ( ExceptOperatorTest ) {
TEST_PARSE_SINGLE_SQL (
" SELECT * FROM students EXCEPT SELECT * FROM students_2; " ,
kStmtSelect ,
SelectStatement ,
result ,
stmt ) ;
ASSERT_STREQ ( stmt - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > name , " students_2 " ) ;
ASSERT_STREQ ( stmt - > fromTable - > name , " students " ) ;
ASSERT_EQ ( stmt - > setOperations - > back ( ) - > setType , kSetExcept ) ;
}
TEST ( IntersectOperatorTest ) {
TEST_PARSE_SINGLE_SQL (
" SELECT * FROM students INTERSECT SELECT * FROM students_2; " ,
kStmtSelect ,
SelectStatement ,
result ,
stmt ) ;
ASSERT_STREQ ( stmt - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > name , " students_2 " ) ;
ASSERT_STREQ ( stmt - > fromTable - > name , " students " ) ;
ASSERT_EQ ( stmt - > setOperations - > back ( ) - > setType , kSetIntersect ) ;
}
TEST ( UnionOperatorTest ) {
TEST_PARSE_SINGLE_SQL (
" SELECT * FROM students UNION SELECT * FROM students_2; " ,
kStmtSelect ,
SelectStatement ,
result ,
stmt ) ;
ASSERT_STREQ ( stmt - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > name , " students_2 " ) ;
ASSERT_STREQ ( stmt - > fromTable - > name , " students " ) ;
ASSERT_EQ ( stmt - > setOperations - > back ( ) - > setType , kSetUnion ) ;
ASSERT_FALSE ( stmt - > setOperations - > back ( ) - > isAll ) ;
}
TEST ( UnionAllOperatorTest ) {
TEST_PARSE_SINGLE_SQL (
" SELECT * FROM students UNION ALL SELECT * FROM students_2; " ,
kStmtSelect ,
SelectStatement ,
result ,
stmt ) ;
ASSERT_STREQ ( stmt - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > name , " students_2 " ) ;
ASSERT_STREQ ( stmt - > fromTable - > name , " students " ) ;
ASSERT_TRUE ( stmt - > setOperations - > back ( ) - > isAll ) ;
}
TEST ( NestedSetOperationTest ) {
TEST_PARSE_SINGLE_SQL (
" SELECT * FROM students INTERSECT SELECT grade FROM students_2 UNION SELECT * FROM employees; " ,
kStmtSelect ,
SelectStatement ,
result ,
stmt ) ;
ASSERT_STREQ ( stmt - > setOperations - > back ( ) - > nestedSelectStatement - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > name , " employees " ) ;
ASSERT_STREQ ( stmt - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > name , " students_2 " ) ;
ASSERT_STREQ ( stmt - > fromTable - > name , " students " ) ;
ASSERT_EQ ( stmt - > setOperations - > back ( ) - > setType , kSetIntersect ) ;
ASSERT_EQ ( stmt - > setOperations - > back ( ) - > nestedSelectStatement - > setOperations - > back ( ) - > setType , kSetUnion ) ;
ASSERT_FALSE ( stmt - > setOperations - > back ( ) - > isAll ) ;
}
TEST ( OrderByFullStatementTest ) {
TEST_PARSE_SINGLE_SQL (
" SELECT * FROM students INTERSECT SELECT grade FROM students_2 UNION SELECT * FROM employees ORDER BY grade ASC; " ,
kStmtSelect ,
SelectStatement ,
result ,
stmt ) ;
ASSERT_EQ ( stmt - > setOperations - > back ( ) - > resultOrder - > at ( 0 ) - > type , kOrderAsc ) ;
ASSERT_STREQ ( stmt - > setOperations - > back ( ) - > resultOrder - > at ( 0 ) - > expr - > name , " grade " ) ;
ASSERT_FALSE ( stmt - > setOperations - > back ( ) - > isAll ) ;
}
TEST ( SetOperationSubQueryOrder ) {
TEST_PARSE_SINGLE_SQL (
" (SELECT * FROM students ORDER BY name DESC) INTERSECT SELECT grade FROM students_2 UNION SELECT * FROM employees ORDER BY grade ASC; " ,
kStmtSelect ,
SelectStatement ,
result ,
stmt ) ;
ASSERT_EQ ( stmt - > order - > at ( 0 ) - > type , kOrderDesc ) ;
ASSERT_STREQ ( stmt - > order - > at ( 0 ) - > expr - > name , " name " ) ;
ASSERT_EQ ( stmt - > setOperations - > back ( ) - > resultOrder - > at ( 0 ) - > type , kOrderAsc ) ;
ASSERT_STREQ ( stmt - > setOperations - > back ( ) - > resultOrder - > at ( 0 ) - > expr - > name , " grade " ) ;
ASSERT_FALSE ( stmt - > setOperations - > back ( ) - > isAll ) ;
}
TEST ( SetOperationLastSubQueryOrder ) {
TEST_PARSE_SINGLE_SQL (
" SELECT * FROM students INTERSECT SELECT grade FROM students_2 UNION (SELECT * FROM employees ORDER BY name DESC) ORDER BY grade ASC; " ,
kStmtSelect ,
SelectStatement ,
result ,
stmt ) ;
ASSERT_EQ ( stmt - > setOperations - > back ( ) - > nestedSelectStatement - > setOperations - > back ( ) - > nestedSelectStatement - > order - > at ( 0 ) - > type , kOrderDesc ) ;
ASSERT_STREQ ( stmt - > setOperations - > back ( ) - > nestedSelectStatement - > setOperations - > back ( ) - > nestedSelectStatement - > order - > at ( 0 ) - > expr - > name , " name " ) ;
ASSERT_EQ ( stmt - > setOperations - > back ( ) - > resultOrder - > at ( 0 ) - > type , kOrderAsc ) ;
ASSERT_STREQ ( stmt - > setOperations - > back ( ) - > resultOrder - > at ( 0 ) - > expr - > name , " grade " ) ;
ASSERT_FALSE ( stmt - > setOperations - > back ( ) - > isAll ) ;
}
TEST ( NestedDifferentSetOperationsWithWithClause ) {
TEST_PARSE_SINGLE_SQL ( " WITH UNION_FIRST AS (SELECT * FROM A UNION SELECT * FROM B) SELECT * FROM UNION_FIRST EXCEPT SELECT * FROM C " ,
kStmtSelect ,
SelectStatement ,
result ,
stmt ) ;
ASSERT_STREQ ( stmt - > withDescriptions - > back ( ) - > alias , " UNION_FIRST " ) ;
ASSERT_EQ ( stmt - > withDescriptions - > back ( ) - > select - > setOperations - > back ( ) - > setType , kSetUnion ) ;
ASSERT_STREQ ( stmt - > withDescriptions - > back ( ) - > select - > fromTable - > name , " A " ) ;
ASSERT_STREQ ( stmt - > withDescriptions - > back ( ) - > select - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > name , " B " ) ;
ASSERT_EQ ( stmt - > setOperations - > back ( ) - > setType , kSetExcept ) ;
ASSERT_STREQ ( stmt - > fromTable - > name , " UNION_FIRST " ) ;
ASSERT_STREQ ( stmt - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > name , " C " ) ;
}
TEST ( NestedAllSetOperationsWithWithClause ) {
TEST_PARSE_SINGLE_SQL ( " WITH UNION_FIRST AS (SELECT * FROM A UNION SELECT * FROM B) SELECT * FROM UNION_FIRST EXCEPT SELECT * FROM (SELECT * FROM C INTERSECT SELECT * FROM D) " ,
kStmtSelect ,
SelectStatement ,
result ,
stmt ) ;
ASSERT_STREQ ( stmt - > withDescriptions - > back ( ) - > alias , " UNION_FIRST " ) ;
ASSERT_EQ ( stmt - > withDescriptions - > back ( ) - > select - > setOperations - > back ( ) - > setType , kSetUnion ) ;
ASSERT_STREQ ( stmt - > withDescriptions - > back ( ) - > select - > fromTable - > name , " A " ) ;
ASSERT_STREQ ( stmt - > withDescriptions - > back ( ) - > select - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > name , " B " ) ;
ASSERT_EQ ( stmt - > setOperations - > back ( ) - > setType , kSetExcept ) ;
ASSERT_STREQ ( stmt - > fromTable - > name , " UNION_FIRST " ) ;
ASSERT_EQ ( stmt - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > select - > setOperations - > back ( ) - > setType , kSetIntersect ) ;
ASSERT_STREQ ( stmt - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > select - > fromTable - > name , " C " ) ;
ASSERT_STREQ ( stmt - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > select - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > name , " D " ) ;
}
TEST ( NestedSetOperationsWithMultipleWithClauses ) {
TEST_PARSE_SINGLE_SQL (
" WITH UNION_FIRST AS (SELECT * FROM A UNION SELECT * FROM B),INTERSECT_SECOND AS (SELECT * FROM UNION_FIRST INTERSECT SELECT * FROM C) SELECT * FROM UNION_FIRST EXCEPT SELECT * FROM INTERSECT_SECOND " ,
kStmtSelect ,
SelectStatement ,
result ,
stmt ) ;
ASSERT_STREQ ( stmt - > withDescriptions - > at ( 0 ) - > alias , " UNION_FIRST " ) ;
ASSERT_STREQ ( stmt - > withDescriptions - > back ( ) - > alias , " INTERSECT_SECOND " ) ;
ASSERT_EQ ( stmt - > withDescriptions - > at ( 0 ) - > select - > setOperations - > back ( ) - > setType , kSetUnion ) ;
ASSERT_STREQ ( stmt - > withDescriptions - > at ( 0 ) - > select - > fromTable - > name , " A " ) ;
ASSERT_STREQ ( stmt - > withDescriptions - > at ( 0 ) - > select - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > name , " B " ) ;
ASSERT_EQ ( stmt - > withDescriptions - > back ( ) - > select - > setOperations - > back ( ) - > setType , kSetIntersect ) ;
ASSERT_STREQ ( stmt - > withDescriptions - > back ( ) - > select - > fromTable - > name , " UNION_FIRST " ) ;
ASSERT_STREQ ( stmt - > withDescriptions - > back ( ) - > select - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > name , " C " ) ;
ASSERT_EQ ( stmt - > setOperations - > back ( ) - > setType , kSetExcept ) ;
ASSERT_STREQ ( stmt - > fromTable - > name , " UNION_FIRST " ) ;
ASSERT_STREQ ( stmt - > setOperations - > back ( ) - > nestedSelectStatement - > fromTable - > name , " INTERSECT_SECOND " ) ;
}
TEST ( WrongOrderByStatementTest ) {
SQLParserResult res = parse_and_move ( " SELECT * FROM students ORDER BY name INTERSECT SELECT grade FROM students_2; " ) ;
ASSERT_FALSE ( res . isValid ( ) ) ;
2018-01-17 15:43:38 +01:00
}
2020-01-14 13:21:19 +01:00
TEST ( BeginTransactionTest ) {
{
TEST_PARSE_SINGLE_SQL (
" BEGIN TRANSACTION; " ,
kStmtTransaction ,
TransactionStatement ,
transaction_result ,
transaction_stmt ) ;
ASSERT_EQ ( transaction_stmt - > command , kBeginTransaction ) ;
}
{
TEST_PARSE_SINGLE_SQL (
" BEGIN; " ,
kStmtTransaction ,
TransactionStatement ,
transaction_result ,
transaction_stmt ) ;
ASSERT_EQ ( transaction_stmt - > command , kBeginTransaction ) ;
}
}
TEST ( RollbackTransactionTest ) {
TEST_PARSE_SINGLE_SQL (
" ROLLBACK TRANSACTION; " ,
kStmtTransaction ,
TransactionStatement ,
transaction_result ,
transaction_stmt ) ;
ASSERT_EQ ( transaction_stmt - > command , kRollbackTransaction ) ;
}
TEST ( CommitTransactionTest ) {
TEST_PARSE_SINGLE_SQL (
" COMMIT TRANSACTION; " ,
kStmtTransaction ,
TransactionStatement ,
transaction_result ,
transaction_stmt ) ;
ASSERT_EQ ( transaction_stmt - > command , kCommitTransaction ) ;
}
2020-06-16 20:16:58 +02:00
TEST ( CastAsType ) {
TEST_PARSE_SINGLE_SQL (
" SELECT CAST(ID AS VARCHAR(8)) FROM TEST " ,
kStmtSelect ,
SelectStatement ,
result ,
stmt ) ;
ASSERT_TRUE ( result . isValid ( ) ) ;
ASSERT_EQ ( 1 , stmt - > selectList - > size ( ) ) ;
ASSERT_STREQ ( " CAST " , stmt - > selectList - > front ( ) - > name ) ;
ASSERT_EQ ( DataType : : VARCHAR , stmt - > selectList - > front ( ) - > columnType . data_type ) ;
ASSERT_EQ ( 8 , stmt - > selectList - > front ( ) - > columnType . length ) ;
}
2017-04-07 16:26:00 +02:00
TEST_MAIN ( ) ;