不要怂,就是干,撸起袖子干!

Commit 5730f76a by Jan Aagaard Meier

Merge pull request #3780 from idris/1589-quote-as-in-joins

Always quote identifiers after AS in join queries. Fixes #3780 
2 parents 176e516a a18181bc
...@@ -1005,7 +1005,7 @@ module.exports = (function() { ...@@ -1005,7 +1005,7 @@ module.exports = (function() {
} else { } else {
prefix = self.quoteIdentifier(as) + '.' + self.quoteIdentifier(attr); prefix = self.quoteIdentifier(as) + '.' + self.quoteIdentifier(attr);
} }
return prefix + ' AS ' + self.quoteIdentifier(as + '.' + attrAs); return prefix + ' AS ' + self.quoteIdentifier(as + '.' + attrAs, true);
}); });
if (include.subQuery && subQuery) { if (include.subQuery && subQuery) {
subQueryAttributes = subQueryAttributes.concat(attributes); subQueryAttributes = subQueryAttributes.concat(attributes);
......
...@@ -204,7 +204,7 @@ module.exports = (function() { ...@@ -204,7 +204,7 @@ module.exports = (function() {
rows.forEach(function(row) { rows.forEach(function(row) {
Utils._.keys(row).forEach(function(key) { Utils._.keys(row).forEach(function(key) {
var targetAttr = attrsMap[key]; var targetAttr = attrsMap[key];
if (targetAttr !== key) { if (typeof targetAttr === 'string' && targetAttr !== key) {
row[targetAttr] = row[key]; row[targetAttr] = row[key];
delete row[key]; delete row[key];
} }
......
'use strict';
/* jshint -W110 */
var Support = require(__dirname + '/../support')
, DataTypes = require(__dirname + '/../../../lib/data-types')
, expectsql = Support.expectsql
, current = Support.sequelize
, sql = current.dialect.QueryGenerator;
// Notice: [] will be replaced by dialect specific tick/quote character when there is not dialect specific expectation but only a default expectation
describe(Support.getTestDialectTeaser('SQL'), function() {
describe('select', function () {
it('*', function () {
expectsql(sql.selectQuery('User'), {
default: 'SELECT * FROM [User];'
});
});
it('with attributes', function () {
expectsql(sql.selectQuery('User', {
attributes: ['name', 'age']
}), {
default: 'SELECT [name], [age] FROM [User];'
});
});
it('include (left outer join)', function () {
var User = Support.sequelize.define('User', {
name: DataTypes.STRING,
age: DataTypes.INTEGER
},
{
freezeTableName: true
});
var Post = Support.sequelize.define('Post', {
title: DataTypes.STRING
},
{
freezeTableName: true
});
expectsql(sql.selectQuery('User', {
attributes: ['name', 'age'],
include: [ {
model: Post,
attributes: ['title'],
association: {
source: User,
target: Post,
identifier: 'user_id'
},
as: 'Post'
} ],
tableAs: 'User'
}), {
default: 'SELECT [User].[name], [User].[age], [Post].[title] AS [Post.title] FROM [User] AS [User] LEFT OUTER JOIN [Post] AS [Post] ON [User].[id] = [Post].[user_id];'
});
});
});
describe('queryIdentifiersFalse', function () {
before(function () {
sql.options.quoteIdentifiers = false;
});
after(function () {
sql.options.quoteIdentifiers = true;
});
it('*', function () {
expectsql(sql.selectQuery('User'), {
default: 'SELECT * FROM [User];',
postgres: 'SELECT * FROM User;'
});
});
it('with attributes', function () {
expectsql(sql.selectQuery('User', {
attributes: ['name', 'age']
}), {
default: 'SELECT [name], [age] FROM [User];',
postgres: 'SELECT name, age FROM User;'
});
});
it('include (left outer join)', function () {
var User = Support.sequelize.define('User', {
name: DataTypes.STRING,
age: DataTypes.INTEGER
},
{
freezeTableName: true
});
var Post = Support.sequelize.define('Post', {
title: DataTypes.STRING
},
{
freezeTableName: true
});
expectsql(sql.selectQuery('User', {
attributes: ['name', 'age'],
include: [ {
model: Post,
attributes: ['title'],
association: {
source: Post,
target: User,
identifier: 'user_id'
},
as: 'Post'
} ],
tableAs: 'User'
}), {
default: 'SELECT [User].[name], [User].[age], [Post].[title] AS [Post.title] FROM [User] AS [User] LEFT OUTER JOIN [Post] AS [Post] ON [User].[id] = [Post].[user_id];',
postgres: 'SELECT User.name, User.age, Post.title AS "Post.title" FROM User AS User LEFT OUTER JOIN Post AS Post ON User.id = Post.user_id;'
});
});
});
});
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!