Skip to content

Commit b2278ff

Browse files
KyleLillybrianc
authored andcommitted
Fix adding/dropping columns with oracle. (brianc#338)
1 parent cc897ca commit b2278ff

2 files changed

Lines changed: 89 additions & 4 deletions

File tree

lib/dialect/oracle.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,56 @@ Oracle.prototype.visitAlias = function(alias) {
2828
return result;
2929
};
3030

31+
Oracle.prototype.visitAlter = function(alter) {
32+
var self=this;
33+
var errMsg='ALTER TABLE cannot be used to perform multiple different operations in the same statement.';
34+
35+
// Implement our own add column:
36+
// PostgreSQL: ALTER TABLE "name" ADD COLUMN "col1", ADD COLUMN "col2"
37+
// Oracle: ALTER TABLE "name" ADD ("col1", "col2")
38+
function _addColumn(){
39+
self._visitingAlter = true;
40+
var table = self._queryNode.table;
41+
self._visitingAddColumn = true;
42+
var result='ALTER TABLE '+self.visit(table.toNode())+' ADD ('+self.visit(alter.nodes[0].nodes[0]);
43+
for (var i= 1,len=alter.nodes.length; i<len; i++){
44+
var node=alter.nodes[i];
45+
assert(node.type=='ADD COLUMN',errMsg);
46+
result+=', '+self.visit(node.nodes[0]);
47+
}
48+
result+=')';
49+
self._visitingAddColumn = false;
50+
self._visitingAlter = false;
51+
return [result];
52+
}
53+
54+
// Implement our own drop column:
55+
// PostgreSQL: ALTER TABLE "name" DROP COLUMN "col1", DROP COLUMN "col2"
56+
// Oracle: ALTER TABLE "name" DROP ("col1", "col2")
57+
function _dropColumn(){
58+
self._visitingAlter = true;
59+
var table = self._queryNode.table;
60+
var result=[
61+
'ALTER TABLE',
62+
self.visit(table.toNode())
63+
];
64+
var columns='DROP ('+self.visit(alter.nodes[0].nodes[0]);
65+
for (var i= 1,len=alter.nodes.length; i<len; i++){
66+
var node=alter.nodes[i];
67+
assert(node.type=='DROP COLUMN',errMsg);
68+
columns+=', '+self.visit(node.nodes[0]);
69+
}
70+
columns+=')';
71+
result.push(columns);
72+
self._visitingAlter = false;
73+
return result;
74+
}
75+
76+
if (isAlterAddColumn(alter)) return _addColumn();
77+
if (isAlterDropColumn(alter)) return _dropColumn();
78+
return Oracle.super_.prototype.visitAlter.call(this, alter);
79+
};
80+
3181
Oracle.prototype.visitTable = function(tableNode) {
3282
var table = tableNode.table;
3383
var txt="";
@@ -256,5 +306,16 @@ function isCountStarExpression(columnNode){
256306
return true;
257307
}
258308

309+
function isAlterAddColumn(alter){
310+
if (alter.nodes.length===0) return false;
311+
if (alter.nodes[0].type!='ADD COLUMN') return false;
312+
return true;
313+
}
314+
315+
function isAlterDropColumn(alter){
316+
if (alter.nodes.length===0) return false;
317+
if (alter.nodes[0].type!='DROP COLUMN') return false;
318+
return true;
319+
}
259320

260321
module.exports = Oracle;

test/dialects/alter-table-tests.js

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ Harness.test({
2222
text : 'ALTER TABLE [post] DROP COLUMN [content]',
2323
string: 'ALTER TABLE [post] DROP COLUMN [content]'
2424
},
25+
oracle: {
26+
text : 'ALTER TABLE "post" DROP ("content")',
27+
string: 'ALTER TABLE "post" DROP ("content")'
28+
},
2529
params: []
2630
});
2731

@@ -43,6 +47,10 @@ Harness.test({
4347
text : 'ALTER TABLE [post] DROP COLUMN [content], [userId]',
4448
string: 'ALTER TABLE [post] DROP COLUMN [content], [userId]'
4549
},
50+
oracle: {
51+
text : 'ALTER TABLE "post" DROP ("content", "userId")',
52+
string: 'ALTER TABLE "post" DROP ("content", "userId")'
53+
},
4654
params: []
4755
});
4856

@@ -64,6 +72,10 @@ Harness.test({
6472
text : 'ALTER TABLE [post] DROP COLUMN [content], [userId]',
6573
string: 'ALTER TABLE [post] DROP COLUMN [content], [userId]'
6674
},
75+
oracle: {
76+
text : 'ALTER TABLE "post" DROP ("content", "userId")',
77+
string: 'ALTER TABLE "post" DROP ("content", "userId")'
78+
},
6779
params: []
6880
});
6981

@@ -118,6 +130,10 @@ Harness.test({
118130
text : 'ALTER TABLE [group] ADD [id] varchar(100)',
119131
string: 'ALTER TABLE [group] ADD [id] varchar(100)'
120132
},
133+
oracle: {
134+
text : 'ALTER TABLE "group" ADD ("id" varchar(100))',
135+
string: 'ALTER TABLE "group" ADD ("id" varchar(100))'
136+
},
121137
params: []
122138
});
123139

@@ -139,6 +155,10 @@ Harness.test({
139155
text : 'ALTER TABLE [group] ADD [id] varchar(100), [userId] varchar(100)',
140156
string: 'ALTER TABLE [group] ADD [id] varchar(100), [userId] varchar(100)'
141157
},
158+
oracle: {
159+
text : 'ALTER TABLE "group" ADD ("id" varchar(100), "userId" varchar(100))',
160+
string: 'ALTER TABLE "group" ADD ("id" varchar(100), "userId" varchar(100))'
161+
},
142162
params: []
143163
});
144164

@@ -160,6 +180,10 @@ Harness.test({
160180
text : 'ALTER TABLE [group] ADD [id] varchar(100), [userId] varchar(100)',
161181
string: 'ALTER TABLE [group] ADD [id] varchar(100), [userId] varchar(100)'
162182
},
183+
oracle: {
184+
text : 'ALTER TABLE "group" ADD ("id" varchar(100), "userId" varchar(100))',
185+
string: 'ALTER TABLE "group" ADD ("id" varchar(100), "userId" varchar(100))'
186+
},
163187
params: []
164188
});
165189

@@ -286,8 +310,8 @@ Harness.test({
286310
string: 'ALTER TABLE `post` ADD COLUMN `userId` int REFERENCES `user`(`id`)'
287311
},
288312
oracle: {
289-
text : 'ALTER TABLE "post" ADD COLUMN "userId" int REFERENCES "user"("id")',
290-
string: 'ALTER TABLE "post" ADD COLUMN "userId" int REFERENCES "user"("id")'
313+
text : 'ALTER TABLE "post" ADD ("userId" int REFERENCES "user"("id"))',
314+
string: 'ALTER TABLE "post" ADD ("userId" int REFERENCES "user"("id"))'
291315
},
292316
params: []
293317
});
@@ -307,8 +331,8 @@ Harness.test({
307331
string: 'ALTER TABLE `post` ADD COLUMN `picture` varchar(100)'
308332
},
309333
oracle: {
310-
text : 'ALTER TABLE "post" ADD COLUMN "picture" varchar(100)',
311-
string: 'ALTER TABLE "post" ADD COLUMN "picture" varchar(100)'
334+
text : 'ALTER TABLE "post" ADD ("picture" varchar(100))',
335+
string: 'ALTER TABLE "post" ADD ("picture" varchar(100))'
312336
},
313337
params: []
314338
});

0 commit comments

Comments
 (0)