Fix an issue with keywords in table or column names

note: table names are a bit more restrictive than column names
And btw. you can always have any name you want, just put it in quotes.
This commit is contained in:
Peinthor Rene
2013-11-24 10:23:55 +01:00
parent 22bb094f25
commit fd89ef72a6
5 changed files with 1689 additions and 556 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
#define INC_Sqlite3Parser_hpp_
#include <antlr/config.hpp>
/* $ANTLR 2.7.7 (20121001): "sqlite3.g" -> "Sqlite3Parser.hpp"$ */
/* $ANTLR 2.7.7 (20130818): "sqlite3.g" -> "Sqlite3Parser.hpp"$ */
#include <antlr/TokenStream.hpp>
#include <antlr/TokenBuffer.hpp>
#include "sqlite3TokenTypes.hpp"
@@ -45,9 +45,11 @@ public:
public: void statement();
public: void createtable();
public: void create_statements();
public: void keywordastablename();
public: void columndef();
public: void tableconstraint();
public: void selectstmt();
public: void keywordascolumnname();
public: void type_name();
public: void columnconstraint();
public: void name();
@@ -74,10 +76,10 @@ protected:
private:
static const char* tokenNames[];
#ifndef NO_STATIC_CONSTS
static const int NUM_TOKENS = 100;
static const int NUM_TOKENS = 102;
#else
enum {
NUM_TOKENS = 100
NUM_TOKENS = 102
};
#endif
@@ -127,6 +129,12 @@ private:
static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_21;
static const unsigned long _tokenSet_22_data_[];
static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_22;
static const unsigned long _tokenSet_23_data_[];
static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_23;
static const unsigned long _tokenSet_24_data_[];
static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_24;
static const unsigned long _tokenSet_25_data_[];
static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_25;
};
#endif /*INC_Sqlite3Parser_hpp_*/

View File

@@ -76,6 +76,8 @@ tokens {
COLUMNCONSTRAINT;
TABLECONSTRAINT;
CREATETABLE;
KEYWORDASTABLENAME;
KEYWORDASCOLUMNNAME;
}
protected
@@ -207,19 +209,109 @@ create_statements
:
createtable
;
keywordastablename
:
( ABORT
| ACTION
| ASC
| CASCADE
| CAST
| CONFLICT
| CURRENT_TIME
| CURRENT_DATE
| CURRENT_TIMESTAMP
| DEFERRED
| DESC
| END
| FAIL
| GLOB
| KEY
| LIKE
| IGNORE
| INITIALLY
| IMMEDIATE
| MATCH
| RAISE
| REGEXP
| REPLACE
| RESTRICT
| ROLLBACK
| TEMPORARY
| TEMP
)
{#keywordastablename = #([KEYWORDASTABLENAME, "KEYWORDASTABLENAME"], #keywordastablename);}
;
createtable
:
CREATE (TEMP|TEMPORARY)? TABLE (IF_T NOT EXISTS)? tablename
CREATE (TEMP|TEMPORARY)? TABLE (IF_T NOT EXISTS)? (tablename | keywordastablename)
( LPAREN columndef (COMMA columndef)* (COMMA tableconstraint)* RPAREN
| AS selectstmt
)
{#createtable = #([CREATETABLE, "CREATETABLE"], #createtable);}
;
keywordascolumnname
:
( ABORT
| ACTION
| AUTOINCREMENT
| AS
| ASC
| AND
| OR
| CASCADE
| CASE_T
| CAST
| CREATE
| COLLATE
| CONFLICT
| CURRENT_TIME
| CURRENT_DATE
| CURRENT_TIMESTAMP
| DEFAULT
| DEFERRABLE
| DEFERRED
| DELETE
| DESC
| ELSE_T
| END
| ESCAPE
| FAIL
| GLOB
| KEY
| LIKE
| TABLE
| IF_T
| IGNORE
| INITIALLY
| IMMEDIATE
| IS
| NOT
| NULL_T
| MATCH
| EXISTS
| ON
| RAISE
| REFERENCES
| REGEXP
| REPLACE
| RESTRICT
| ROLLBACK
| SET
| TEMPORARY
| TEMP
| THEN
| UPDATE
| WHEN
)
{#keywordascolumnname = #([KEYWORDASCOLUMNNAME, "KEYWORDASCOLUMNNAME"], #keywordascolumnname);}
;
columndef
:
columnname (type_name)? (columnconstraint)*
(columnname | keywordascolumnname) (type_name)? (columnconstraint)*
{#columndef = #([COLUMNDEF, "COLUMNDEF"], #columndef);}
;

View File

@@ -1,7 +1,7 @@
#ifndef INC_sqlite3TokenTypes_hpp_
#define INC_sqlite3TokenTypes_hpp_
/* $ANTLR 2.7.7 (20121001): "sqlite3.g" -> "sqlite3TokenTypes.hpp"$ */
/* $ANTLR 2.7.7 (20130818): "sqlite3.g" -> "sqlite3TokenTypes.hpp"$ */
#ifndef CUSTOM_API
# define CUSTOM_API
@@ -73,41 +73,43 @@ struct CUSTOM_API sqlite3TokenTypes {
COLUMNCONSTRAINT = 62,
TABLECONSTRAINT = 63,
CREATETABLE = 64,
DIGIT = 65,
DOT = 66,
ID = 67,
QUOTEDID = 68,
NUMERIC = 69,
NL = 70,
COMMENT = 71,
WS = 72,
STRINGLITERAL = 73,
LPAREN = 74,
RPAREN = 75,
COMMA = 76,
SEMI = 77,
PLUS = 78,
MINUS = 79,
STAR = 80,
TILDE = 81,
AMPERSAND = 82,
BITOR = 83,
OROP = 84,
EQUAL = 85,
EQUAL2 = 86,
GREATER = 87,
GREATEREQUAL = 88,
LOWER = 89,
LOWEREQUAL = 90,
UNEQUAL = 91,
UNEQUAL2 = 92,
BITWISELEFT = 93,
BITWISERIGHT = 94,
NO = 95,
SELECT = 96,
SLASH = 97,
PERCENT = 98,
IN = 99,
KEYWORDASTABLENAME = 65,
KEYWORDASCOLUMNNAME = 66,
DIGIT = 67,
DOT = 68,
ID = 69,
QUOTEDID = 70,
NUMERIC = 71,
NL = 72,
COMMENT = 73,
WS = 74,
STRINGLITERAL = 75,
LPAREN = 76,
RPAREN = 77,
COMMA = 78,
SEMI = 79,
PLUS = 80,
MINUS = 81,
STAR = 82,
TILDE = 83,
AMPERSAND = 84,
BITOR = 85,
OROP = 86,
EQUAL = 87,
EQUAL2 = 88,
GREATER = 89,
GREATEREQUAL = 90,
LOWER = 91,
LOWEREQUAL = 92,
UNEQUAL = 93,
UNEQUAL2 = 94,
BITWISELEFT = 95,
BITWISERIGHT = 96,
NO = 97,
SELECT = 98,
SLASH = 99,
PERCENT = 100,
IN = 101,
NULL_TREE_LOOKAHEAD = 3
};
#ifdef __cplusplus

View File

@@ -248,7 +248,8 @@ Table CreateTableWalker::table()
//skip to tablename
while(s->getType() != Sqlite3Lexer::ID &&
s->getType() != Sqlite3Lexer::QUOTEDID &&
s->getType() != Sqlite3Lexer::STRINGLITERAL)
s->getType() != Sqlite3Lexer::STRINGLITERAL &&
s->getType() != sqlite3TokenTypes::KEYWORDASTABLENAME)
{
s = s->getNextSibling();
}
@@ -315,7 +316,10 @@ void CreateTableWalker::parsecolumn(FieldPtr& f, antlr::RefAST c)
QString defaultvalue;
QString check;
columnname = identifier(c);
if(c->getType() == sqlite3TokenTypes::KEYWORDASCOLUMNNAME)
columnname = concatTextAST(c->getFirstChild());
else
columnname = identifier(c);
c = c->getNextSibling(); //type?
if(c != antlr::nullAST && c->getType() == sqlite3TokenTypes::TYPE_NAME)
{