No FROM required (#94)

This commit is contained in:
Moritz Eyssen 2018-05-22 15:35:39 +02:00 committed by mrks
parent c7e8309363
commit 82e73f66d2
4 changed files with 964 additions and 912 deletions

File diff suppressed because it is too large Load Diff

View File

@ -193,7 +193,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const cha
%type <sval> file_path prepare_target_query %type <sval> file_path prepare_target_query
%type <bval> opt_not_exists opt_exists opt_distinct %type <bval> opt_not_exists opt_exists opt_distinct
%type <uval> import_file_type opt_join_type column_type %type <uval> import_file_type opt_join_type column_type
%type <table> from_clause table_ref table_ref_atomic table_ref_name nonjoin_table_ref_atomic %type <table> opt_from_clause from_clause table_ref table_ref_atomic table_ref_name nonjoin_table_ref_atomic
%type <table> join_clause table_ref_name_no_alias %type <table> join_clause table_ref_name_no_alias
%type <expr> expr operand scalar_expr unary_expr binary_expr logic_expr exists_expr %type <expr> expr operand scalar_expr unary_expr binary_expr logic_expr exists_expr
%type <expr> function_expr between_expr expr_alias param_expr %type <expr> function_expr between_expr expr_alias param_expr
@ -640,7 +640,7 @@ opt_all:
; ;
select_clause: select_clause:
SELECT opt_top opt_distinct select_list from_clause opt_where opt_group { SELECT opt_top opt_distinct select_list opt_from_clause opt_where opt_group {
$$ = new SelectStatement(); $$ = new SelectStatement();
$$->limit = $2; $$->limit = $2;
$$->selectDistinct = $3; $$->selectDistinct = $3;
@ -660,6 +660,10 @@ select_list:
expr_list expr_list
; ;
opt_from_clause:
from_clause { $$ = $1; }
| /* empty */ { $$ = nullptr; }
from_clause: from_clause:
FROM table_ref { $$ = $2; } FROM table_ref { $$ = $2; }
; ;

View File

@ -4,10 +4,9 @@
! !
!1 !1
!gibberish; !gibberish;
!SELECT abc; !CREATE TABLE "table" FROM TBL FILE 'students.tbl';gibberish
!CREATE TABLE "table" FROM TBL FILE 'students.tbl';SELECT 1
!CREATE TABLE "table" FROM TBL FILE 'students.tbl';1 !CREATE TABLE "table" FROM TBL FILE 'students.tbl';1
!INSERT INTO test_table VALUESd (1, 2, 'test'); !INSERT INTO test_table VALUESd (1, 2, 'test');
!SELECT * FROM t WHERE a = ? AND b = ?;SELECT 1; !SELECT * FROM t WHERE a = ? AND b = ?;gibberish;
!SHOW COLUMNS; !SHOW COLUMNS;
!select a + 2 as b(spam, eggs) from B; !select a + 2 as b(spam, eggs) from B;

View File

@ -542,3 +542,22 @@ TEST(SetLimitOffset) {
ASSERT_EQ(stmt->limit->offset, kNoOffset); ASSERT_EQ(stmt->limit->offset, kNoOffset);
} }
TEST(NoFromClause) {
TEST_PARSE_SINGLE_SQL(
"SELECT 1 + 2;",
kStmtSelect,
SelectStatement,
result,
stmt);
ASSERT_TRUE(stmt->selectList);
ASSERT_FALSE(stmt->fromTable);
ASSERT_FALSE(stmt->whereClause);
ASSERT_FALSE(stmt->groupBy);
ASSERT_EQ(stmt->selectList->size(), 1u);
ASSERT_EQ(stmt->selectList->at(0)->type, kExprOperator);
ASSERT_EQ(stmt->selectList->at(0)->expr->type, kExprLiteralInt);
ASSERT_EQ(stmt->selectList->at(0)->expr2->type, kExprLiteralInt);
}