Support Create Table As Syntax (#127)
* support create table as select statement * Generate bison code * add test
This commit is contained in:
parent
6003ab58d1
commit
de4f81bb18
File diff suppressed because it is too large
Load Diff
|
@ -1,8 +1,9 @@
|
|||
/* A Bison parser, made by GNU Bison 3.0.4. */
|
||||
/* A Bison parser, made by GNU Bison 3.3.2. */
|
||||
|
||||
/* Bison interface for Yacc-like parsers in C
|
||||
|
||||
Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
|
||||
Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -30,6 +31,9 @@
|
|||
This special exception was added by the Free Software Foundation in
|
||||
version 2.2 of Bison. */
|
||||
|
||||
/* Undocumented macros, especially those whose name start with YY_,
|
||||
are private implementation details. Do not rely on them. */
|
||||
|
||||
#ifndef YY_HSQL_BISON_PARSER_H_INCLUDED
|
||||
# define YY_HSQL_BISON_PARSER_H_INCLUDED
|
||||
/* Debug traces. */
|
||||
|
@ -48,7 +52,7 @@
|
|||
extern int hsql_debug;
|
||||
#endif
|
||||
/* "%code requires" blocks. */
|
||||
#line 35 "bison_parser.y" /* yacc.c:1909 */
|
||||
#line 35 "bison_parser.y" /* yacc.c:1921 */
|
||||
|
||||
// %code requires block
|
||||
|
||||
|
@ -72,7 +76,7 @@ extern int hsql_debug;
|
|||
} \
|
||||
}
|
||||
|
||||
#line 76 "bison_parser.h" /* yacc.c:1909 */
|
||||
#line 80 "bison_parser.h" /* yacc.c:1921 */
|
||||
|
||||
/* Token type. */
|
||||
#ifndef HSQL_TOKENTYPE
|
||||
|
@ -230,7 +234,7 @@ extern int hsql_debug;
|
|||
|
||||
union HSQL_STYPE
|
||||
{
|
||||
#line 95 "bison_parser.y" /* yacc.c:1909 */
|
||||
#line 95 "bison_parser.y" /* yacc.c:1921 */
|
||||
|
||||
double fval;
|
||||
int64_t ival;
|
||||
|
@ -274,7 +278,7 @@ union HSQL_STYPE
|
|||
std::vector<hsql::OrderDescription*>* order_vec;
|
||||
std::vector<hsql::WithDescription*>* with_description_vec;
|
||||
|
||||
#line 278 "bison_parser.h" /* yacc.c:1909 */
|
||||
#line 282 "bison_parser.h" /* yacc.c:1921 */
|
||||
};
|
||||
|
||||
typedef union HSQL_STYPE HSQL_STYPE;
|
||||
|
|
|
@ -430,6 +430,13 @@ create_statement:
|
|||
$$->tableName = $4.name;
|
||||
$$->columns = $6;
|
||||
}
|
||||
| CREATE TABLE opt_not_exists table_name AS select_statement {
|
||||
$$ = new CreateStatement(kCreateTable);
|
||||
$$->ifNotExists = $3;
|
||||
$$->schema = $4.schema;
|
||||
$$->tableName = $4.name;
|
||||
$$->select = $6;
|
||||
}
|
||||
| CREATE VIEW opt_not_exists table_name opt_column_list AS select_statement {
|
||||
$$ = new CreateStatement(kCreateView);
|
||||
$$->ifNotExists = $3;
|
||||
|
|
|
@ -26,6 +26,8 @@ CREATE TABLE "table" FROM TBL FILE 'students.tbl'
|
|||
CREATE TABLE IF NOT EXISTS "table" FROM TBL FILE 'students.tbl'
|
||||
CREATE TABLE students (name TEXT, student_number INTEGER, city TEXT, grade DOUBLE)
|
||||
CREATE TABLE teachers (name VARCHAR(30), student_number LONG, city CHAR(10), grade FLOAT)
|
||||
CREATE TABLE students_2 AS SELECT * FROM students
|
||||
CREATE TABLE students_3 AS SELECT city, grade FROM students WHERE grade > 3.0
|
||||
# Multiple statements
|
||||
CREATE TABLE "table" FROM TBL FILE 'students.tbl'; SELECT * FROM "table";
|
||||
# INSERT
|
||||
|
|
|
@ -58,6 +58,24 @@ TEST(CreateStatementTest) {
|
|||
ASSERT_EQ(stmt->columns->at(3)->nullable, false);
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
TEST(UpdateStatementTest) {
|
||||
SQLParserResult result;
|
||||
|
|
Loading…
Reference in New Issue