Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit07557f3

Browse files
committed
Implement INSERT
1 parent05a067e commit07557f3

File tree

3 files changed

+187
-5
lines changed

3 files changed

+187
-5
lines changed

‎src/sqlParser.jison

Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
[\w]+[\u4e00-\u9fa5]+[0-9a-zA-Z_\u4e00-\u9fa5]*return'IDENTIFIER'
1616
[\u4e00-\u9fa5][0-9a-zA-Z_\u4e00-\u9fa5]*return'IDENTIFIER'
1717
SELECTreturn'SELECT'
18+
INSERTreturn'INSERT'
19+
DEFAULTreturn'DEFAULT'
1820
ALLreturn'ALL'
1921
ANYreturn'ANY'
2022
DISTINCTreturn'DISTINCT'
@@ -67,6 +69,8 @@ ORDER\s+BY return 'ORDER_
6769
GROUP\s+BYreturn'GROUP_BY'
6870
IGNOREreturn'IGNORE'
6971
LOW_PRIORITYreturn'LOW_PRIORITY'
72+
DELAYEDreturn'DELAYED'
73+
HIGH_PRIORITYreturn'HIGH_PRIORITY'
7074
FORCEreturn'FORCE'
7175
INNERreturn'INNER'
7276
CROSSreturn'CROSS'
@@ -91,6 +95,12 @@ SHARE return 'SHARE'
9195
MODEreturn'MODE'
9296
OJreturn'OJ'
9397
LIMITreturn'LIMIT'
98+
INTOreturn'INTO'
99+
VALUEreturn'VALUE'
100+
VALUESreturn'VALUES'
101+
DUPLICATEreturn'DUPLICATE'
102+
KEYreturn'KEY'
103+
UPDATEreturn'UPDATE'
94104

95105
","return','
96106
"="return'='
@@ -168,13 +178,74 @@ main
168178
query
169179
: selectClause
170180
| updateClause
181+
| insertClause
182+
;
183+
184+
insertClause
185+
: INSERT priority_opt ignore_opt
186+
into_opt identifier
187+
partitionOpt
188+
insert_cols
189+
insert_source
190+
on_dup_assigns
191+
{
192+
$$= {
193+
type:'Insert',
194+
priority:$2,
195+
ignore:$3,
196+
into:$4,
197+
table:$5,
198+
partitions:$6,
199+
cols:$7,
200+
src:$8,
201+
duplicateAssignments:$9
202+
}
203+
}
204+
;
205+
206+
insert_source
207+
: insert_value value_list_list {$$= { type:'Values', keyword:$1, values:$2 }}
208+
| selectClause
209+
;
210+
211+
on_dup_assigns
212+
: {$$=null}
213+
| ON DUPLICATE KEY UPDATE assignment_list {$$=$5}
214+
;
215+
216+
insert_cols
217+
: {$$=null}
218+
|'(' identifier_list')' {$$=$2}
219+
;
220+
221+
value
222+
: expr| DEFAULT
223+
;
224+
225+
value_list
226+
: value_list',' value {$1.value.push($3);}
227+
| value {$$= { type:'ValueList', value: [$1 ] }}
228+
;
229+
230+
value_list_list
231+
: value_list_list',''(' value_list')' {$1.value.push($4);}
232+
|'(' value_list')' {$$= { type:'InsertList', value: [$2 ] }}
233+
;
234+
235+
insert_value
236+
: VALUE| VALUES
237+
;
238+
239+
into_opt
240+
: {$$=null}
241+
| INTO {$$=$1}
171242
;
172243

173244
updateClause
174245
: UPDATE low_priority_opt ignore_opt
175246
table_refrences
176247
SET
177-
assignmentList
248+
assignment_list
178249
where_opt
179250
order_by_opt
180251
limit_opt
@@ -197,6 +268,13 @@ low_priority_opt
197268
| LOW_PRIORITY {$$=$1}
198269
;
199270

271+
priority_opt
272+
: {$$=null}
273+
| LOW_PRIORITY {$$=$1}
274+
| HIGH_PRIORITY {$$=$1}
275+
| DELAYED {$$=$1}
276+
;
277+
200278
ignore_opt
201279
: {$$=null}
202280
| IGNORE {$$=$1}
@@ -206,8 +284,8 @@ assignment
206284
: identifier'=' expr {$$= { type:'Assignment', left:$1, right:$3 }}
207285
;
208286

209-
assignmentList
210-
:assignmentList',' assignment {$1.value.push($3);}
287+
assignment_list
288+
:assignment_list',' assignment {$1.value.push($3);}
211289
| assignment {$$= { type:'AssignmentList', value: [$1 ] }}
212290
;
213291

‎src/stringify.js

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ Sql.prototype.travelMain = function(ast) {
5959
this.travelSelect(ast.value);
6060
}elseif(ast.value.type==='Update'){
6161
this.travelUpdate(ast.value);
62+
}elseif(ast.value.type==='Insert'){
63+
this.travelInsert(ast.value);
6264
}else{
6365
thrownewError('Unknown query value type');
6466
}
@@ -129,6 +131,64 @@ Sql.prototype.travelSelect = function(ast) {
129131
this.appendKeyword(ast.updateLockMode);
130132
}
131133
}
134+
Sql.prototype.travelInsert=function(ast){
135+
this.appendKeyword('insert',true);
136+
137+
if(ast.lowPriority){
138+
this.appendKeyword('low_priority');
139+
}
140+
if(ast.ignore){
141+
this.appendKeyword('ignore');
142+
}
143+
if(ast.into){
144+
this.appendKeyword('into');
145+
}
146+
this.travelTableRefrence(ast.table);
147+
if(ast.partitions){
148+
this.travelPartitions(ast.partitions);
149+
}
150+
if(ast.cols){
151+
this.travel('(');
152+
this.travelIdentifierList(ast.cols);
153+
this.travel(')');
154+
}
155+
this.travel(ast.value);
156+
if(ast.src.type==='Select'){
157+
this.travelSelect(ast.src);
158+
}elseif(ast.src.type==='Values'){
159+
this.travel(ast.src.keyword);
160+
this.travelInsertRows(ast.src.values);
161+
}
162+
if(ast.duplicateAssignments){
163+
this.appendKeyword('ON');
164+
this.appendKeyword('DUPLICATE');
165+
this.appendKeyword('KEY');
166+
this.appendKeyword('UPDATE');
167+
this.travelAssignments(ast.duplicateAssignments);
168+
}
169+
}
170+
Sql.prototype.travelInsertRows=function(ast){
171+
for(vari=0;i<ast.value.length;i++){
172+
varx=ast.value[i];
173+
this.travel('(');
174+
this.travelValueList(x.value);
175+
this.travel(')');
176+
177+
if(i!==ast.value.length-1){
178+
this.append(',',true);
179+
}
180+
}
181+
}
182+
Sql.prototype.travelValueList=function(ast){
183+
for(vari=0;i<ast.length;i++){
184+
varx=ast[i];
185+
this.travel(x);
186+
187+
if(i!==ast.length-1){
188+
this.append(',',true);
189+
}
190+
}
191+
}
132192
Sql.prototype.travelUpdate=function(ast){
133193
this.appendKeyword('update',true);
134194
if(ast.lowPriority){
@@ -154,9 +214,9 @@ Sql.prototype.travelUpdate = function(ast) {
154214
Sql.prototype.travelAssignments=function(ast){
155215
for(vari=0;i<ast.value.length;i++){
156216
varx=ast.value[i];
157-
this.travelIdentifier(x.left);
217+
this.travel(x.left);
158218
this.travel('=');
159-
this.travelIdentifier(x.right);
219+
this.travel(x.right);
160220

161221
if(i!==ast.value.length-1){
162222
this.append(',',true);

‎test/main.test.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,11 @@ AND (rd.rd_numberofrooms <= (select sum(rn.reservation_numberofrooms) as count_r
137137
testParser('select a from b limit 2;');
138138
});
139139

140+
it('subquery.',function(){
141+
testParser('select a from (select 1 as x) b limit 2;');
142+
});
143+
144+
140145
it('update0',function(){
141146
testParser('update A SET b=2 WHERE c=3;');
142147
});
@@ -148,4 +153,43 @@ AND (rd.rd_numberofrooms <= (select sum(rn.reservation_numberofrooms) as count_r
148153
it('update2',function(){
149154
testParser('update LOW_PRIORITY ignore A, B, C SET b=2, `C`.c=d WHERE e=4 ORDER BY d DESC limit 1;');
150155
});
156+
157+
it('insert0',function(){
158+
testParser('INSERT INTO A VALUES (a, `b`), (c, 3)');
159+
});
160+
161+
it('insert1',function(){
162+
testParser('INSERT DELAYED IGNORE INTO A VALUE (a, DEFAULT, 3+2)');
163+
});
164+
165+
it('insert2',function(){
166+
testParser('INSERT DELAYED IGNORE INTO A VALUE (a, `b`)');
167+
});
168+
169+
it('insert3',function(){
170+
testParser('INSERT DELAYED IGNORE INTO A (`a`, b, c) VALUE (1, 2+3)');
171+
});
172+
173+
it('insert4',function(){
174+
testParser('INSERT DELAYED IGNORE INTO `s0`.`A` PARTITION (p0, p1) (`a`, b, c) VALUE (1, 2+3)');
175+
});
176+
177+
it('insert5',function(){
178+
testParser(`
179+
INSERT DELAYED IGNORE INTO \`s0\`.\`A\`
180+
PARTITION (p0, p1) (\`a\`, b, c)
181+
VALUE (1, 2+3), (5, '6')
182+
ON DUPLICATE KEY UPDATE q=q+1, c=b
183+
`);
184+
});
185+
186+
it('insert6',function(){
187+
testParser(`
188+
INSERT HIGH_PRIORITY \`massdrop\`.\`A\`
189+
PARTITION (p0, p1) (\`a\`, b, c)
190+
SELECT 1+1 as b, d
191+
FROM B
192+
ON DUPLICATE KEY UPDATE q=q+1, c=b
193+
`);
194+
});
151195
});

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp