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

Commit 64e9b7ac by Sushant

fix(query-generator): regexp operator

1 parent 7b7b23d5
...@@ -2355,10 +2355,6 @@ class QueryGenerator { ...@@ -2355,10 +2355,6 @@ class QueryGenerator {
} }
} }
if (comparator.indexOf(this.OperatorMap[Op.regexp]) !== -1) {
return this._joinKeyValue(key, `'${value}'`, comparator, options.prefix);
}
if (value === null && comparator === this.OperatorMap[Op.eq]) { if (value === null && comparator === this.OperatorMap[Op.eq]) {
return this._joinKeyValue(key, this.escape(value, field, escapeOptions), this.OperatorMap[Op.is], options.prefix); return this._joinKeyValue(key, this.escape(value, field, escapeOptions), this.OperatorMap[Op.is], options.prefix);
} else if (value === null && comparator === this.OperatorMap[Op.ne]) { } else if (value === null && comparator === this.OperatorMap[Op.ne]) {
......
'use strict'; 'use strict';
const chai = require('chai'), const chai = require('chai'),
Sequelize = require('../../../../index'), Sequelize = require('../../index'),
Op = Sequelize.Op, Op = Sequelize.Op,
Promise = Sequelize.Promise, Promise = Sequelize.Promise,
expect = chai.expect, expect = chai.expect,
Support = require(__dirname + '/../../support'), Support = require(__dirname + '/../support'),
DataTypes = require(__dirname + '/../../../../lib/data-types'), DataTypes = require(__dirname + '/../../lib/data-types'),
dialect = Support.getTestDialect(); dialect = Support.getTestDialect();
describe(Support.getTestDialectTeaser('Model'), () => { describe(Support.getTestDialectTeaser('Operators'), () => {
describe('attributes', () => { describe('REGEXP', () => {
describe('operators', () => { beforeEach(function() {
describe('REGEXP', () => { this.User = this.sequelize.define('user', {
beforeEach(function() { id: {
const queryInterface = this.sequelize.getQueryInterface(); type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true,
field: 'userId'
},
name: {
type: DataTypes.STRING,
field: 'full_name'
}
}, {
tableName: 'users',
timestamps: false
});
this.User = this.sequelize.define('user', { return Promise.all([
id: { this.sequelize.getQueryInterface().createTable('users', {
type: DataTypes.INTEGER, userId: {
allowNull: false, type: DataTypes.INTEGER,
primaryKey: true, allowNull: false,
autoIncrement: true, primaryKey: true,
field: 'userId' autoIncrement: true
}, },
name: { full_name: {
type: DataTypes.STRING, type: DataTypes.STRING
field: 'full_name' }
} })
}, { ]);
tableName: 'users', });
timestamps: false
});
return Promise.all([ if (dialect === 'mysql' || dialect === 'postgres') {
queryInterface.createTable('users', { describe('case sensitive', () => {
userId: { it('should work with a regexp where', function() {
type: DataTypes.INTEGER, return this.User.create({
allowNull: false, name: 'Foobar'
primaryKey: true, }).then(() => {
autoIncrement: true return this.User.find({
}, where: {
full_name: { name: {
type: DataTypes.STRING [Op.regexp]: '^Foo'
}
} }
}) });
]); }).then(user => {
expect(user).to.be.ok;
});
}); });
if (dialect === 'mysql' || dialect === 'postgres') { it('should work with a not regexp where', function() {
it('should work with a regexp where', function() { return this.User.create({
const self = this; name: 'Foobar'
}).then(() => {
return this.User.find({
where: {
name: {
[Op.notRegexp]: '^Foo'
}
}
});
}).then(user => {
expect(user).to.not.be.ok;
});
});
return this.User.create({ it('should properly escape regular expressions', function() {
name: 'Foobar' return this.User.bulkCreate([{
}).then(() => { name: 'John'
return self.User.find({ }, {
where: { name: 'Bob'
name: { }]).then(() => {
[Op.regexp]: '^Foo' return this.User.findAll({
} where: {
name: {
[Op.notRegexp]: "Bob'; drop table users --"
} }
}); }
}).then(user => {
expect(user).to.be.ok;
}); });
}).then(() => {
return this.User.findAll({
where: {
name: {
[Op.regexp]: "Bob'; drop table users --"
}
}
});
}).then(() => {
return this.User.findAll();
}).then(users => {
expect(users).length(2);
}); });
});
});
}
it('should work with a not regexp where', function() { if (dialect === 'postgres') {
const self = this; describe('case insensitive', () => {
it('should work with a case-insensitive regexp where', function() {
const self = this;
return this.User.create({ return this.User.create({
name: 'Foobar' name: 'Foobar'
}).then(() => { }).then(() => {
return self.User.find({ return self.User.find({
where: { where: {
name: { name: {
[Op.notRegexp]: '^Foo' [Op.iRegexp]: '^foo'
}
} }
}); }
}).then(user => {
expect(user).to.not.be.ok;
}); });
}).then(user => {
expect(user).to.be.ok;
}); });
});
if (dialect === 'postgres') { it('should work with a case-insensitive not regexp where', function() {
it('should work with a case-insensitive regexp where', function() { const self = this;
const self = this;
return this.User.create({ return this.User.create({
name: 'Foobar' name: 'Foobar'
}).then(() => { }).then(() => {
return self.User.find({ return self.User.find({
where: { where: {
name: { name: {
[Op.iRegexp]: '^foo' [Op.notIRegexp]: '^foo'
} }
} }
});
}).then(user => {
expect(user).to.be.ok;
});
}); });
}).then(user => {
expect(user).to.not.be.ok;
});
});
it('should work with a case-insensitive not regexp where', function() { it('should properly escape regular expressions', function() {
const self = this; return this.User.bulkCreate([{
name: 'John'
return this.User.create({ }, {
name: 'Foobar' name: 'Bob'
}).then(() => { }]).then(() => {
return self.User.find({ return this.User.findAll({
where: { where: {
name: { name: {
[Op.notIRegexp]: '^foo' [Op.iRegexp]: "Bob'; drop table users --"
} }
} }
});
}).then(user => {
expect(user).to.not.be.ok;
});
}); });
} }).then(() => {
} return this.User.findAll({
where: {
name: {
[Op.notIRegexp]: "Bob'; drop table users --"
}
}
});
}).then(() => {
return this.User.findAll();
}).then(users => {
expect(users).length(2);
});
});
}); });
}); }
}); });
}); });
...@@ -1014,7 +1014,7 @@ suite(Support.getTestDialectTeaser('SQL'), () => { ...@@ -1014,7 +1014,7 @@ suite(Support.getTestDialectTeaser('SQL'), () => {
testsql('newline', { testsql('newline', {
[Op.regexp]: '^new\nline$' [Op.regexp]: '^new\nline$'
}, { }, {
mysql: "`newline` REGEXP '^new\nline$'", mysql: "`newline` REGEXP '^new\\nline$'",
postgres: '"newline" ~ \'^new\nline$\'' postgres: '"newline" ~ \'^new\nline$\''
}); });
}); });
...@@ -1032,7 +1032,7 @@ suite(Support.getTestDialectTeaser('SQL'), () => { ...@@ -1032,7 +1032,7 @@ suite(Support.getTestDialectTeaser('SQL'), () => {
testsql('newline', { testsql('newline', {
[Op.notRegexp]: '^new\nline$' [Op.notRegexp]: '^new\nline$'
}, { }, {
mysql: "`newline` NOT REGEXP '^new\nline$'", mysql: "`newline` NOT REGEXP '^new\\nline$'",
postgres: '"newline" !~ \'^new\nline$\'' postgres: '"newline" !~ \'^new\nline$\''
}); });
}); });
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!