@@ -225,7 +225,7 @@ TEST(ParserTests, SelectWithMultipleJoins) {
225225}
226226
227227TEST (ParserTests, SelectWithJoinNoCondition) {
228- // JOIN without ON condition - parsed but condition is nullptr
228+ // JOIN without ON condition is accepted with nullptr condition
229229 auto stmt = parse (" SELECT * FROM users JOIN orders" );
230230 ASSERT_NE (stmt, nullptr );
231231
@@ -255,6 +255,7 @@ TEST(ParserTests, CreateTableIfNotExists) {
255255 auto * create = as<CreateTableStatement>(stmt);
256256 ASSERT_NE (create, nullptr );
257257 EXPECT_EQ (create->table_name (), " users" );
258+ EXPECT_TRUE (create->if_not_exists ());
258259}
259260
260261TEST (ParserTests, CreateTableWithPrimaryKey) {
@@ -508,14 +509,34 @@ TEST(ParserTests, ParseStringConstant) {
508509}
509510
510511TEST (ParserTests, ParseBooleanConstants) {
512+ // TRUE and FALSE are parsed as identifiers/function calls (not as constants)
513+ // because the lexer recognizes TRUE/FALSE as keywords but parse_primary
514+ // only handles NULL specially, not TRUE/FALSE
511515 auto stmt1 = parse (" SELECT TRUE FROM t" );
512516 ASSERT_NE (stmt1, nullptr );
517+ auto * select1 = as<SelectStatement>(stmt1);
518+ ASSERT_NE (select1, nullptr );
519+ ASSERT_GE (select1->columns ().size (), 1U );
520+ // TRUE is parsed as a column expression (identifier)
521+ EXPECT_EQ (select1->columns ()[0 ]->type (), ExprType::Column);
513522
514523 auto stmt2 = parse (" SELECT FALSE FROM t" );
515524 ASSERT_NE (stmt2, nullptr );
525+ auto * select2 = as<SelectStatement>(stmt2);
526+ ASSERT_NE (select2, nullptr );
527+ ASSERT_GE (select2->columns ().size (), 1U );
528+ EXPECT_EQ (select2->columns ()[0 ]->type (), ExprType::Column);
516529
530+ // NULL is parsed as ConstantExpr with null value
517531 auto stmt3 = parse (" SELECT NULL FROM t" );
518532 ASSERT_NE (stmt3, nullptr );
533+ auto * select3 = as<SelectStatement>(stmt3);
534+ ASSERT_NE (select3, nullptr );
535+ ASSERT_GE (select3->columns ().size (), 1U );
536+ EXPECT_EQ (select3->columns ()[0 ]->type (), ExprType::Constant);
537+ auto * const3 = dynamic_cast <ConstantExpr*>(select3->columns ()[0 ].get ());
538+ ASSERT_NE (const3, nullptr );
539+ EXPECT_TRUE (const3->value ().is_null ());
519540}
520541
521542TEST (ParserTests, ParseColumnReference) {
@@ -566,8 +587,33 @@ TEST(ParserTests, ParseArithmeticPrecedence) {
566587 auto * select = as<SelectStatement>(stmt);
567588 ASSERT_NE (select, nullptr );
568589 ASSERT_GE (select->columns ().size (), 1U );
590+
569591 // Top level is BinaryExpr with + operator
570- // Left is 1, Right is BinaryExpr with * operator
592+ auto * top_bin = dynamic_cast <BinaryExpr*>(select->columns ()[0 ].get ());
593+ ASSERT_NE (top_bin, nullptr );
594+ EXPECT_EQ (top_bin->op (), TokenType::Plus);
595+
596+ // Left child is ConstantExpr with value 1
597+ auto * left = dynamic_cast <ConstantExpr*>(const_cast <Expression*>(&top_bin->left ()));
598+ ASSERT_NE (left, nullptr );
599+ EXPECT_EQ (left->value ().as_int64 (), 1 );
600+
601+ // Right child is BinaryExpr with * operator
602+ auto * right_bin = dynamic_cast <BinaryExpr*>(const_cast <Expression*>(&top_bin->right ()));
603+ ASSERT_NE (right_bin, nullptr );
604+ EXPECT_EQ (right_bin->op (), TokenType::Star);
605+
606+ // Right's left is ConstantExpr with value 2
607+ auto * right_left =
608+ dynamic_cast <ConstantExpr*>(const_cast <Expression*>(&right_bin->left ()));
609+ ASSERT_NE (right_left, nullptr );
610+ EXPECT_EQ (right_left->value ().as_int64 (), 2 );
611+
612+ // Right's right is ConstantExpr with value 3
613+ auto * right_right =
614+ dynamic_cast <ConstantExpr*>(const_cast <Expression*>(&right_bin->right ()));
615+ ASSERT_NE (right_right, nullptr );
616+ EXPECT_EQ (right_right->value ().as_int64 (), 3 );
571617}
572618
573619TEST (ParserTests, ParseLogicalAnd) {
0 commit comments