grammar: Add window functions to parser

We don't do anything with the extended parser yet but I'm not even sure
the window functions can be used in CREATE TABLE or CREATE INDEX
statements anyway.
This commit is contained in:
Martin Kleusberg
2018-09-28 16:11:11 +02:00
parent 903e66485c
commit 517743ff3f
5 changed files with 1367 additions and 227 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -66,7 +66,11 @@ public:
public: void castexpr();
public: void caseexpr();
public: void raisefunction();
public: void windowfunc();
public: void suffixexpr();
public: void windowdefn();
public: void orderingterm();
public: void framespec();
public: void like_operator();
public: void between_subexpr();
public:
@@ -80,10 +84,10 @@ protected:
private:
static const char* tokenNames[];
#ifndef NO_STATIC_CONSTS
static const int NUM_TOKENS = 113;
static const int NUM_TOKENS = 125;
#else
enum {
NUM_TOKENS = 113
NUM_TOKENS = 125
};
#endif
@@ -137,6 +141,14 @@ private:
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;
static const unsigned long _tokenSet_26_data_[];
static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_26;
static const unsigned long _tokenSet_27_data_[];
static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_27;
static const unsigned long _tokenSet_28_data_[];
static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_28;
};
#endif /*INC_Sqlite3Parser_hpp_*/

View File

@@ -41,6 +41,8 @@ tokens {
END="END";
ESCAPE="ESCAPE";
FAIL="FAIL";
FILTER="FILTER";
FOLLOWING="FOLLOWING";
FOREIGN="FOREIGN";
GLOB="GLOB";
KEY="KEY";
@@ -60,18 +62,24 @@ tokens {
MATCH="MATCH";
EXISTS="EXISTS";
ON="ON";
OVER="OVER";
PARTITION="PARTITION";
PRECEDING="PRECEDING";
PRIMARY="PRIMARY";
RAISE="RAISE";
RANGE="RANGE";
REFERENCES="REFERENCES";
REGEXP="REGEXP";
REPLACE="REPLACE";
RESTRICT="RESTRICT";
ROLLBACK="ROLLBACK";
ROWID="ROWID";
ROWS="ROWS";
SET="SET";
TEMPORARY="TEMPORARY";
TEMP="TEMP";
THEN="THEN";
UNBOUNDED="UNBOUNDED";
UNIQUE="UNIQUE";
UPDATE="UPDATE";
USING="USING";
@@ -446,6 +454,7 @@ subexpr
| EXISTS LPAREN (expr | selectstmt) RPAREN
| caseexpr
| raisefunction
| windowfunc
)
(suffixexpr)?
;
@@ -460,6 +469,54 @@ caseexpr
CASE_T (expr)? (WHEN expr THEN expr)+ (ELSE_T expr)? END
;
windowfunc
:
functionname LPAREN (STAR | (expr (COMMA expr)*))? RPAREN (FILTER LPAREN WHERE expr RPAREN)? OVER
(
(LPAREN windowdefn RPAREN)
| id
)
;
windowdefn
:
(PARTITION BY expr (COMMA expr)*)?
(ORDER BY orderingterm (COMMA orderingterm)*)?
(framespec)?
;
orderingterm
:
expr (COLLATE collationname)? (ASC | DESC)?
;
framespec
:
(RANGE | ROWS)
(BETWEEN
(
(UNBOUNDED PRECEDING)
| (expr PRECEDING)
| (CURRENT ROW)
| (expr FOLLOWING)
)
AND
(
(expr PRECEDING)
| (CURRENT ROW)
| (expr FOLLOWING)
| (UNBOUNDED FOLLOWING)
)
)
|
(
(UNBOUNDED PRECEDING)
| (expr PRECEDING)
| (CURRENT ROW)
| (expr FOLLOWING)
)
;
like_operator
:
LIKE

View File

@@ -40,87 +40,99 @@ struct CUSTOM_API sqlite3TokenTypes {
END = 29,
ESCAPE = 30,
FAIL = 31,
FOREIGN = 32,
GLOB = 33,
KEY = 34,
LIKE = 35,
TABLE = 36,
IF_T = 37,
IGNORE = 38,
IN = 39,
INDEX = 40,
INITIALLY = 41,
INSERT = 42,
IMMEDIATE = 43,
IS = 44,
NO = 45,
NOT = 46,
NULL_T = 47,
MATCH = 48,
EXISTS = 49,
ON = 50,
PRIMARY = 51,
RAISE = 52,
REFERENCES = 53,
REGEXP = 54,
REPLACE = 55,
RESTRICT = 56,
ROLLBACK = 57,
ROWID = 58,
SET = 59,
TEMPORARY = 60,
TEMP = 61,
THEN = 62,
UNIQUE = 63,
UPDATE = 64,
USING = 65,
VIRTUAL = 66,
WHEN = 67,
WHERE = 68,
WITHOUT = 69,
TYPE_NAME = 70,
COLUMNDEF = 71,
COLUMNCONSTRAINT = 72,
TABLECONSTRAINT = 73,
CREATETABLE = 74,
CREATEINDEX = 75,
INDEXEDCOLUMN = 76,
KEYWORDASTABLENAME = 77,
KEYWORDASCOLUMNNAME = 78,
DIGIT = 79,
DOT = 80,
ID = 81,
QUOTEDID = 82,
QUOTEDLITERAL = 83,
NUMERIC = 84,
NL = 85,
COMMENT = 86,
WS = 87,
STRINGLITERAL = 88,
LPAREN = 89,
RPAREN = 90,
COMMA = 91,
SEMI = 92,
PLUS = 93,
MINUS = 94,
STAR = 95,
TILDE = 96,
AMPERSAND = 97,
BITOR = 98,
OROP = 99,
EQUAL = 100,
EQUAL2 = 101,
GREATER = 102,
GREATEREQUAL = 103,
LOWER = 104,
LOWEREQUAL = 105,
UNEQUAL = 106,
UNEQUAL2 = 107,
BITWISELEFT = 108,
BITWISERIGHT = 109,
SELECT = 110,
SLASH = 111,
PERCENT = 112,
FILTER = 32,
FOLLOWING = 33,
FOREIGN = 34,
GLOB = 35,
KEY = 36,
LIKE = 37,
TABLE = 38,
IF_T = 39,
IGNORE = 40,
IN = 41,
INDEX = 42,
INITIALLY = 43,
INSERT = 44,
IMMEDIATE = 45,
IS = 46,
NO = 47,
NOT = 48,
NULL_T = 49,
MATCH = 50,
EXISTS = 51,
ON = 52,
OVER = 53,
PARTITION = 54,
PRECEDING = 55,
PRIMARY = 56,
RAISE = 57,
RANGE = 58,
REFERENCES = 59,
REGEXP = 60,
REPLACE = 61,
RESTRICT = 62,
ROLLBACK = 63,
ROWID = 64,
ROWS = 65,
SET = 66,
TEMPORARY = 67,
TEMP = 68,
THEN = 69,
UNBOUNDED = 70,
UNIQUE = 71,
UPDATE = 72,
USING = 73,
VIRTUAL = 74,
WHEN = 75,
WHERE = 76,
WITHOUT = 77,
TYPE_NAME = 78,
COLUMNDEF = 79,
COLUMNCONSTRAINT = 80,
TABLECONSTRAINT = 81,
CREATETABLE = 82,
CREATEINDEX = 83,
INDEXEDCOLUMN = 84,
KEYWORDASTABLENAME = 85,
KEYWORDASCOLUMNNAME = 86,
DIGIT = 87,
DOT = 88,
ID = 89,
QUOTEDID = 90,
QUOTEDLITERAL = 91,
NUMERIC = 92,
NL = 93,
COMMENT = 94,
WS = 95,
STRINGLITERAL = 96,
LPAREN = 97,
RPAREN = 98,
COMMA = 99,
SEMI = 100,
PLUS = 101,
MINUS = 102,
STAR = 103,
TILDE = 104,
AMPERSAND = 105,
BITOR = 106,
OROP = 107,
EQUAL = 108,
EQUAL2 = 109,
GREATER = 110,
GREATEREQUAL = 111,
LOWER = 112,
LOWEREQUAL = 113,
UNEQUAL = 114,
UNEQUAL2 = 115,
BITWISELEFT = 116,
BITWISERIGHT = 117,
SELECT = 118,
BY = 119,
ORDER = 120,
CURRENT = 121,
ROW = 122,
SLASH = 123,
PERCENT = 124,
NULL_TREE_LOOKAHEAD = 3
};
#ifdef __cplusplus