Skip to content

Commit 85eaaf6

Browse files
committed
Add INSERT-related tokens, node types, and keyword table entries
New tokens: TK_DELAYED, TK_HIGH_PRIORITY, TK_DUPLICATE, TK_KEY, TK_CONFLICT, TK_DO, TK_NOTHING, TK_RETURNING, TK_CONSTRAINT. New node types: NODE_INSERT_STMT, NODE_INSERT_COLUMNS, NODE_VALUES_CLAUSE, NODE_VALUES_ROW, NODE_INSERT_SET_CLAUSE, NODE_ON_DUPLICATE_KEY, NODE_ON_CONFLICT, NODE_CONFLICT_TARGET, NODE_CONFLICT_ACTION, NODE_RETURNING_CLAUSE, NODE_UPDATE_SET_ITEM, NODE_STMT_OPTIONS. Updated is_alias_start() blocklist and keyword-as-identifier list.
1 parent b66f241 commit 85eaaf6

6 files changed

Lines changed: 55 additions & 0 deletions

File tree

include/sql_parser/common.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,22 @@ enum class NodeType : uint16_t {
143143
NODE_BETWEEN,
144144
NODE_IN_LIST,
145145
NODE_CASE_WHEN,
146+
147+
// INSERT nodes
148+
NODE_INSERT_STMT,
149+
NODE_INSERT_COLUMNS, // (col1, col2, ...)
150+
NODE_VALUES_CLAUSE, // VALUES keyword wrapper
151+
NODE_VALUES_ROW, // single (val1, val2, ...) row
152+
NODE_INSERT_SET_CLAUSE, // MySQL INSERT ... SET col=val form
153+
NODE_ON_DUPLICATE_KEY, // MySQL ON DUPLICATE KEY UPDATE
154+
NODE_ON_CONFLICT, // PostgreSQL ON CONFLICT
155+
NODE_CONFLICT_TARGET, // PostgreSQL conflict target (cols or ON CONSTRAINT)
156+
NODE_CONFLICT_ACTION, // DO UPDATE SET ... or DO NOTHING
157+
NODE_RETURNING_CLAUSE, // PostgreSQL RETURNING expr_list
158+
159+
// Shared
160+
NODE_STMT_OPTIONS, // LOW_PRIORITY, IGNORE, QUICK, DELAYED, etc.
161+
NODE_UPDATE_SET_ITEM, // single col=expr pair (shared by INSERT SET and UPDATE SET)
146162
};
147163

148164
} // namespace sql_parser

include/sql_parser/expression_parser.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,15 @@ class ExpressionParser {
440440
case TokenType::TK_SHARE:
441441
case TokenType::TK_DATA:
442442
case TokenType::TK_RESET:
443+
case TokenType::TK_KEY:
444+
case TokenType::TK_DO:
445+
case TokenType::TK_NOTHING:
446+
case TokenType::TK_CONFLICT:
447+
case TokenType::TK_CONSTRAINT:
448+
case TokenType::TK_RETURNING:
449+
case TokenType::TK_DUPLICATE:
450+
case TokenType::TK_DELAYED:
451+
case TokenType::TK_HIGH_PRIORITY:
443452
return true;
444453
default:
445454
return false;

include/sql_parser/keywords_mysql.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,23 @@ inline constexpr KeywordEntry KEYWORDS[] = {
3030
{"COLLATE", 7, TokenType::TK_COLLATE},
3131
{"COMMIT", 6, TokenType::TK_COMMIT},
3232
{"COMMITTED", 9, TokenType::TK_COMMITTED},
33+
{"CONFLICT", 8, TokenType::TK_CONFLICT},
34+
{"CONSTRAINT", 10, TokenType::TK_CONSTRAINT},
3335
{"COUNT", 5, TokenType::TK_COUNT},
3436
{"CREATE", 6, TokenType::TK_CREATE},
3537
{"CROSS", 5, TokenType::TK_CROSS},
3638
{"DATA", 4, TokenType::TK_DATA},
3739
{"DATABASE", 8, TokenType::TK_DATABASE},
3840
{"DEALLOCATE", 10, TokenType::TK_DEALLOCATE},
3941
{"DEFAULT", 7, TokenType::TK_DEFAULT},
42+
{"DELAYED", 7, TokenType::TK_DELAYED},
4043
{"DELETE", 6, TokenType::TK_DELETE},
4144
{"DESC", 4, TokenType::TK_DESC},
4245
{"DISTINCT", 8, TokenType::TK_DISTINCT},
46+
{"DO", 2, TokenType::TK_DO},
4347
{"DROP", 4, TokenType::TK_DROP},
4448
{"DUMPFILE", 8, TokenType::TK_DUMPFILE},
49+
{"DUPLICATE", 9, TokenType::TK_DUPLICATE},
4550
{"ELSE", 4, TokenType::TK_ELSE},
4651
{"END", 3, TokenType::TK_END},
4752
{"EXECUTE", 7, TokenType::TK_EXECUTE},
@@ -55,6 +60,7 @@ inline constexpr KeywordEntry KEYWORDS[] = {
5560
{"GRANT", 5, TokenType::TK_GRANT},
5661
{"GROUP", 5, TokenType::TK_GROUP},
5762
{"HAVING", 6, TokenType::TK_HAVING},
63+
{"HIGH_PRIORITY", 13, TokenType::TK_HIGH_PRIORITY},
5864
{"IF", 2, TokenType::TK_IF},
5965
{"IGNORE", 6, TokenType::TK_IGNORE},
6066
{"IN", 2, TokenType::TK_IN},
@@ -65,6 +71,7 @@ inline constexpr KeywordEntry KEYWORDS[] = {
6571
{"IS", 2, TokenType::TK_IS},
6672
{"ISOLATION", 9, TokenType::TK_ISOLATION},
6773
{"JOIN", 4, TokenType::TK_JOIN},
74+
{"KEY", 3, TokenType::TK_KEY},
6875
{"LEFT", 4, TokenType::TK_LEFT},
6976
{"LEVEL", 5, TokenType::TK_LEVEL},
7077
{"LIKE", 4, TokenType::TK_LIKE},
@@ -79,6 +86,7 @@ inline constexpr KeywordEntry KEYWORDS[] = {
7986
{"NAMES", 5, TokenType::TK_NAMES},
8087
{"NATURAL", 7, TokenType::TK_NATURAL},
8188
{"NOT", 3, TokenType::TK_NOT},
89+
{"NOTHING", 7, TokenType::TK_NOTHING},
8290
{"NOWAIT", 6, TokenType::TK_NOWAIT},
8391
{"NULL", 4, TokenType::TK_NULL},
8492
{"OF", 2, TokenType::TK_OF},
@@ -96,6 +104,7 @@ inline constexpr KeywordEntry KEYWORDS[] = {
96104
{"REPEATABLE", 10, TokenType::TK_REPEATABLE},
97105
{"REPLACE", 7, TokenType::TK_REPLACE},
98106
{"RESET", 5, TokenType::TK_RESET},
107+
{"RETURNING", 9, TokenType::TK_RETURNING},
99108
{"REVOKE", 6, TokenType::TK_REVOKE},
100109
{"RIGHT", 5, TokenType::TK_RIGHT},
101110
{"ROLLBACK", 8, TokenType::TK_ROLLBACK},

include/sql_parser/keywords_pgsql.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ inline constexpr KeywordEntry KEYWORDS[] = {
2727
{"COLLATE", 7, TokenType::TK_COLLATE},
2828
{"COMMIT", 6, TokenType::TK_COMMIT},
2929
{"COMMITTED", 9, TokenType::TK_COMMITTED},
30+
{"CONFLICT", 8, TokenType::TK_CONFLICT},
31+
{"CONSTRAINT", 10, TokenType::TK_CONSTRAINT},
3032
{"COUNT", 5, TokenType::TK_COUNT},
3133
{"CREATE", 6, TokenType::TK_CREATE},
3234
{"CROSS", 5, TokenType::TK_CROSS},
@@ -37,6 +39,7 @@ inline constexpr KeywordEntry KEYWORDS[] = {
3739
{"DELETE", 6, TokenType::TK_DELETE},
3840
{"DESC", 4, TokenType::TK_DESC},
3941
{"DISTINCT", 8, TokenType::TK_DISTINCT},
42+
{"DO", 2, TokenType::TK_DO},
4043
{"DROP", 4, TokenType::TK_DROP},
4144
{"ELSE", 4, TokenType::TK_ELSE},
4245
{"END", 3, TokenType::TK_END},
@@ -71,6 +74,7 @@ inline constexpr KeywordEntry KEYWORDS[] = {
7174
{"NAMES", 5, TokenType::TK_NAMES},
7275
{"NATURAL", 7, TokenType::TK_NATURAL},
7376
{"NOT", 3, TokenType::TK_NOT},
77+
{"NOTHING", 7, TokenType::TK_NOTHING},
7478
{"NULL", 4, TokenType::TK_NULL},
7579
{"OF", 2, TokenType::TK_OF},
7680
{"OFFSET", 6, TokenType::TK_OFFSET},
@@ -83,6 +87,7 @@ inline constexpr KeywordEntry KEYWORDS[] = {
8387
{"READ", 4, TokenType::TK_READ},
8488
{"REPEATABLE", 10, TokenType::TK_REPEATABLE},
8589
{"RESET", 5, TokenType::TK_RESET},
90+
{"RETURNING", 9, TokenType::TK_RETURNING},
8691
{"REVOKE", 6, TokenType::TK_REVOKE},
8792
{"RIGHT", 5, TokenType::TK_RIGHT},
8893
{"ROLLBACK", 8, TokenType::TK_ROLLBACK},

include/sql_parser/table_ref_parser.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,11 @@ class TableRefParser {
216216
case TokenType::TK_VALUES:
217217
case TokenType::TK_SELECT:
218218
case TokenType::TK_DEFAULT:
219+
case TokenType::TK_RETURNING:
220+
case TokenType::TK_CONFLICT:
221+
case TokenType::TK_DO:
222+
case TokenType::TK_NOTHING:
223+
case TokenType::TK_DUPLICATE:
219224
return false;
220225
default:
221226
return true; // Keywords not in the blocklist can be implicit aliases

include/sql_parser/token.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,17 @@ enum class TokenType : uint16_t {
6464
TK_UNION, TK_OF,
6565
TK_SQL_CALC_FOUND_ROWS,
6666
TK_COUNT, TK_SUM, TK_AVG, TK_MIN, TK_MAX,
67+
68+
// INSERT/REPLACE related tokens
69+
TK_DELAYED,
70+
TK_HIGH_PRIORITY,
71+
TK_DUPLICATE,
72+
TK_KEY,
73+
TK_CONFLICT,
74+
TK_DO,
75+
TK_NOTHING,
76+
TK_RETURNING,
77+
TK_CONSTRAINT,
6778
};
6879

6980
struct Token {

0 commit comments

Comments
 (0)