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

Commit 64e9b7ac by Sushant

fix(query-generator): regexp operator

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