Skip to content

Commit a6bd967

Browse files
committed
grammar: Support conflict clause in primary key constraint
Support conflict clauses (like ON CONFLICT REPLACE) inside a PRIMARY KEY column constraint. See https://www.sqlite.org/syntax/column-constraint.html
1 parent c6f585e commit a6bd967

File tree

2 files changed

+67
-34
lines changed

2 files changed

+67
-34
lines changed

src/grammar/Sqlite3Parser.cpp

Lines changed: 66 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $ANTLR 2.7.7 (20140222): "sqlite3.g" -> "Sqlite3Parser.cpp"$ */
1+
/* $ANTLR 2.7.7 (20141010): "sqlite3.g" -> "Sqlite3Parser.cpp"$ */
22
#include "Sqlite3Parser.hpp"
33
#include <antlr/NoViableAltException.hpp>
44
#include <antlr/SemanticException.hpp>
@@ -1076,11 +1076,11 @@ void Sqlite3Parser::tableconstraint() {
10761076
}
10771077
}
10781078
else {
1079-
goto _loop124;
1079+
goto _loop125;
10801080
}
10811081

10821082
}
1083-
_loop124:;
1083+
_loop125:;
10841084
} // ( ... )*
10851085
ANTLR_USE_NAMESPACE(antlr)RefAST tmp57_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
10861086
if ( inputState->guessing == 0 ) {
@@ -1149,11 +1149,11 @@ void Sqlite3Parser::tableconstraint() {
11491149
}
11501150
}
11511151
else {
1152-
goto _loop127;
1152+
goto _loop128;
11531153
}
11541154

11551155
}
1156-
_loop127:;
1156+
_loop128:;
11571157
} // ( ... )*
11581158
ANTLR_USE_NAMESPACE(antlr)RefAST tmp61_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
11591159
if ( inputState->guessing == 0 ) {
@@ -1254,11 +1254,11 @@ void Sqlite3Parser::tableconstraint() {
12541254
}
12551255
}
12561256
else {
1257-
goto _loop130;
1257+
goto _loop131;
12581258
}
12591259

12601260
}
1261-
_loop130:;
1261+
_loop131:;
12621262
} // ( ... )*
12631263
ANTLR_USE_NAMESPACE(antlr)RefAST tmp69_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
12641264
if ( inputState->guessing == 0 ) {
@@ -2124,6 +2124,39 @@ void Sqlite3Parser::columnconstraint() {
21242124
case FOREIGN:
21252125
case NOT:
21262126
case NULL_T:
2127+
case ON:
2128+
case PRIMARY:
2129+
case REFERENCES:
2130+
case UNIQUE:
2131+
case RPAREN:
2132+
case COMMA:
2133+
{
2134+
break;
2135+
}
2136+
default:
2137+
{
2138+
throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());
2139+
}
2140+
}
2141+
}
2142+
{
2143+
switch ( LA(1)) {
2144+
case ON:
2145+
{
2146+
conflictclause();
2147+
if (inputState->guessing==0) {
2148+
astFactory->addASTChild( currentAST, returnAST );
2149+
}
2150+
break;
2151+
}
2152+
case AUTOINCREMENT:
2153+
case CHECK:
2154+
case COLLATE:
2155+
case CONSTRAINT:
2156+
case DEFAULT:
2157+
case FOREIGN:
2158+
case NOT:
2159+
case NULL_T:
21272160
case PRIMARY:
21282161
case REFERENCES:
21292162
case UNIQUE:
@@ -2638,11 +2671,11 @@ void Sqlite3Parser::expr() {
26382671
}
26392672
}
26402673
else {
2641-
goto _loop158;
2674+
goto _loop159;
26422675
}
26432676

26442677
}
2645-
_loop158:;
2678+
_loop159:;
26462679
} // ( ... )*
26472680
expr_AST = currentAST.root;
26482681
returnAST = expr_AST;
@@ -2772,11 +2805,11 @@ void Sqlite3Parser::foreignkeyclause() {
27722805
}
27732806
}
27742807
else {
2775-
goto _loop140;
2808+
goto _loop141;
27762809
}
27772810

27782811
}
2779-
_loop140:;
2812+
_loop141:;
27802813
} // ( ... )*
27812814
ANTLR_USE_NAMESPACE(antlr)RefAST tmp166_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
27822815
if ( inputState->guessing == 0 ) {
@@ -2959,17 +2992,17 @@ void Sqlite3Parser::foreignkeyclause() {
29592992
}
29602993
default:
29612994
{
2962-
goto _loop145;
2995+
goto _loop146;
29632996
}
29642997
}
29652998
}
2966-
_loop145:;
2999+
_loop146:;
29673000
} // ( ... )*
29683001
{
2969-
bool synPredMatched148 = false;
3002+
bool synPredMatched149 = false;
29703003
if (((LA(1) == NOT) && (LA(2) == DEFERRABLE))) {
2971-
int _m148 = mark();
2972-
synPredMatched148 = true;
3004+
int _m149 = mark();
3005+
synPredMatched149 = true;
29733006
inputState->guessing++;
29743007
try {
29753008
{
@@ -2978,12 +3011,12 @@ void Sqlite3Parser::foreignkeyclause() {
29783011
}
29793012
}
29803013
catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
2981-
synPredMatched148 = false;
3014+
synPredMatched149 = false;
29823015
}
2983-
rewind(_m148);
3016+
rewind(_m149);
29843017
inputState->guessing--;
29853018
}
2986-
if ( synPredMatched148 ) {
3019+
if ( synPredMatched149 ) {
29873020
ANTLR_USE_NAMESPACE(antlr)RefAST tmp179_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
29883021
if ( inputState->guessing == 0 ) {
29893022
tmp179_AST = astFactory->create(LT(1));
@@ -3480,11 +3513,11 @@ void Sqlite3Parser::subexpr() {
34803513
}
34813514
}
34823515
else {
3483-
goto _loop166;
3516+
goto _loop167;
34843517
}
34853518

34863519
}
3487-
_loop166:;
3520+
_loop167:;
34883521
} // ( ... )*
34893522
break;
34903523
}
@@ -3968,7 +4001,7 @@ void Sqlite3Parser::caseexpr() {
39684001

39694002
}
39704003
{ // ( ... )+
3971-
int _cnt174=0;
4004+
int _cnt175=0;
39724005
for (;;) {
39734006
if ((LA(1) == WHEN)) {
39744007
ANTLR_USE_NAMESPACE(antlr)RefAST tmp227_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
@@ -3993,12 +4026,12 @@ void Sqlite3Parser::caseexpr() {
39934026
}
39944027
}
39954028
else {
3996-
if ( _cnt174>=1 ) { goto _loop174; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
4029+
if ( _cnt175>=1 ) { goto _loop175; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
39974030
}
39984031

3999-
_cnt174++;
4032+
_cnt175++;
40004033
}
4001-
_loop174:;
4034+
_loop175:;
40024035
} // ( ... )+
40034036
{
40044037
switch ( LA(1)) {
@@ -4264,11 +4297,11 @@ void Sqlite3Parser::suffixexpr() {
42644297
}
42654298
}
42664299
else {
4267-
goto _loop185;
4300+
goto _loop186;
42684301
}
42694302

42704303
}
4271-
_loop185:;
4304+
_loop186:;
42724305
} // ( ... )*
42734306
ANTLR_USE_NAMESPACE(antlr)RefAST tmp244_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
42744307
if ( inputState->guessing == 0 ) {
@@ -4391,11 +4424,11 @@ void Sqlite3Parser::suffixexpr() {
43914424
}
43924425
}
43934426
else {
4394-
goto _loop189;
4427+
goto _loop190;
43954428
}
43964429

43974430
}
4398-
_loop189:;
4431+
_loop190:;
43994432
} // ( ... )*
44004433
break;
44014434
}
@@ -4556,7 +4589,7 @@ void Sqlite3Parser::between_subexpr() {
45564589
astFactory->addASTChild( currentAST, returnAST );
45574590
}
45584591
{ // ( ... )+
4559-
int _cnt179=0;
4592+
int _cnt180=0;
45604593
for (;;) {
45614594
if ((LA(1) == AND)) {
45624595
ANTLR_USE_NAMESPACE(antlr)RefAST tmp254_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
@@ -4571,12 +4604,12 @@ void Sqlite3Parser::between_subexpr() {
45714604
}
45724605
}
45734606
else {
4574-
if ( _cnt179>=1 ) { goto _loop179; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
4607+
if ( _cnt180>=1 ) { goto _loop180; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
45754608
}
45764609

4577-
_cnt179++;
4610+
_cnt180++;
45784611
}
4579-
_loop179:;
4612+
_loop180:;
45804613
} // ( ... )+
45814614
between_subexpr_AST = currentAST.root;
45824615
returnAST = between_subexpr_AST;

src/grammar/sqlite3.g

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ type_name
348348
columnconstraint
349349
:
350350
(CONSTRAINT name)?
351-
( PRIMARY KEY (ASC|DESC)? (AUTOINCREMENT)?
351+
( PRIMARY KEY (ASC|DESC)? (conflictclause)? (AUTOINCREMENT)?
352352
| (NOT)? NULL_T (conflictclause)?
353353
| UNIQUE (conflictclause)?
354354
| CHECK LPAREN expr RPAREN

0 commit comments

Comments
 (0)