Skip to content

Commit 0d4d4ab

Browse files
authored
feat: where condition support NULL value (ali-sdk#60)
closes ali-sdk#59 and ali-sdk#35
1 parent 6658389 commit 0d4d4ab

File tree

5 files changed

+45
-18
lines changed

5 files changed

+45
-18
lines changed

lib/operator.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,11 @@ proto._where = function(where) {
320320
if (Array.isArray(value)) {
321321
wheres.push('?? IN (?)');
322322
} else {
323-
wheres.push('?? = ?');
323+
if (value === null || value === undefined) {
324+
wheres.push('?? IS ?');
325+
} else {
326+
wheres.push('?? = ?');
327+
}
324328
}
325329
values.push(key);
326330
values.push(value);

test/async.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -440,21 +440,21 @@ describe('async.test.js', function() {
440440
it('should get exists object without columns', async function() {
441441
let user = await this.db.get(table, { email: prefix + 'm@fengmk2-get.com' });
442442
assert(user);
443-
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
443+
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
444444
assert.equal(user.name, prefix + 'fengmk2-get');
445445

446446
user = await this.db.get(table, { email: prefix + 'm@fengmk2-get.com' }, {
447447
orders: [[ 'id', 'desc' ]],
448448
});
449449
assert(user);
450-
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
450+
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
451451
assert.equal(user.name, prefix + 'fengmk3-get');
452452

453453
user = await this.db.get(table, { email: prefix + 'm@fengmk2-get.com' }, {
454454
orders: [[ 'id', 'desc' ], 'gmt_modified', [ 'gmt_create', 'asc' ]],
455455
});
456456
assert(user);
457-
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
457+
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
458458
assert.equal(user.name, prefix + 'fengmk3-get');
459459
});
460460

@@ -480,7 +480,7 @@ describe('async.test.js', function() {
480480
});
481481
assert(users);
482482
assert.equal(users.length, 2);
483-
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
483+
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
484484
assert.equal(users[0].name, prefix + 'fengmk2-get');
485485

486486
users = await this.db.select(table, {
@@ -490,7 +490,7 @@ describe('async.test.js', function() {
490490
});
491491
assert(users);
492492
assert.equal(users.length, 1);
493-
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
493+
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
494494
assert.equal(users[0].name, prefix + 'fengmk3-get');
495495

496496
users = await this.db.select(table, {
@@ -501,7 +501,7 @@ describe('async.test.js', function() {
501501
});
502502
assert(users);
503503
assert.equal(users.length, 1);
504-
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
504+
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
505505
assert.equal(users[0].name, prefix + 'fengmk2-get');
506506

507507
users = await this.db.select(table, {
@@ -518,7 +518,7 @@ describe('async.test.js', function() {
518518
const users = await this.db.select(table);
519519
assert(users);
520520
assert.equal(users.length > 2, true);
521-
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
521+
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
522522
});
523523

524524
it('should select with options.orders', async function() {

test/client.test.js

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -456,26 +456,45 @@ describe('client.test.js', function() {
456456
email: prefix + 'm@fengmk2-get.com',
457457
});
458458
assert.equal(result.affectedRows, 1);
459+
460+
result = yield this.db.insert(table, {
461+
name: prefix + 'fengmk-mobile-get',
462+
email: prefix + 'm@fengmk2-mobile-get.com',
463+
mobile: prefix + '13800000000',
464+
});
465+
assert.equal(result.affectedRows, 1);
466+
});
467+
468+
it('should get support NULL value', function* () {
469+
let user = yield this.db.get(table, { mobile: null });
470+
assert(user);
471+
assert(user.mobile === null);
472+
user = yield this.db.get(table, { mobile: undefined });
473+
assert(user);
474+
assert(user.mobile === null);
475+
user = yield this.db.get(table, { mobile: prefix + '13800000000' });
476+
assert(user);
477+
assert(user.mobile === prefix + '13800000000');
459478
});
460479

461480
it('should get exists object without columns', function* () {
462481
let user = yield this.db.get(table, { email: prefix + 'm@fengmk2-get.com' });
463482
assert(user);
464-
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
483+
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
465484
assert.equal(user.name, prefix + 'fengmk2-get');
466485

467486
user = yield this.db.get(table, { email: prefix + 'm@fengmk2-get.com' }, {
468487
orders: [[ 'id', 'desc' ]],
469488
});
470489
assert(user);
471-
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
490+
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
472491
assert.equal(user.name, prefix + 'fengmk3-get');
473492

474493
user = yield this.db.get(table, { email: prefix + 'm@fengmk2-get.com' }, {
475494
orders: [[ 'id', 'desc' ], 'gmt_modified', [ 'gmt_create', 'asc' ]],
476495
});
477496
assert(user);
478-
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
497+
assert.deepEqual(Object.keys(user), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
479498
assert.equal(user.name, prefix + 'fengmk3-get');
480499
});
481500

@@ -501,7 +520,7 @@ describe('client.test.js', function() {
501520
});
502521
assert(users);
503522
assert.equal(users.length, 2);
504-
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
523+
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
505524
assert.equal(users[0].name, prefix + 'fengmk2-get');
506525

507526
users = yield this.db.select(table, {
@@ -511,7 +530,7 @@ describe('client.test.js', function() {
511530
});
512531
assert(users);
513532
assert.equal(users.length, 1);
514-
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
533+
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
515534
assert.equal(users[0].name, prefix + 'fengmk3-get');
516535

517536
users = yield this.db.select(table, {
@@ -522,7 +541,7 @@ describe('client.test.js', function() {
522541
});
523542
assert(users);
524543
assert.equal(users.length, 1);
525-
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
544+
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
526545
assert.equal(users[0].name, prefix + 'fengmk2-get');
527546

528547
users = yield this.db.select(table, {
@@ -539,7 +558,7 @@ describe('client.test.js', function() {
539558
const users = yield this.db.select(table);
540559
assert(users);
541560
assert.equal(users.length > 2, true);
542-
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email' ]);
561+
assert.deepEqual(Object.keys(users[0]), [ 'id', 'gmt_create', 'gmt_modified', 'name', 'email', 'mobile' ]);
543562
});
544563

545564
it('should select with options.orders', function* () {
@@ -725,7 +744,8 @@ describe('client.test.js', function() {
725744
let result = yield this.db.update(table, {
726745
name: prefix + 'fengmk2-update',
727746
email: prefix + 'm@fengmk2-update2.com',
728-
gmt_create: 'now()', // invalid date
747+
// gmt_create: 'now()', // invalid date, will throw error now
748+
gmt_create: this.db.literals.now,
729749
gmt_modified: this.db.literals.now,
730750
}, {
731751
where: {
@@ -738,8 +758,9 @@ describe('client.test.js', function() {
738758
name: prefix + 'fengmk2-update',
739759
});
740760
assert.equal(user.email, prefix + 'm@fengmk2-update2.com');
741-
assert.equal(user.gmt_create, '0000-00-00 00:00:00');
761+
// assert.equal(user.gmt_create, '0000-00-00 00:00:00');
742762
assert(user.gmt_modified instanceof Date);
763+
assert(user.gmt_create instanceof Date);
743764

744765
user.email = prefix + 'm@fengmk2-update3.com';
745766
result = yield this.db.update(table, user, {

test/operator.test.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ describe('operator.test.js', function() {
1515
assert.equal(op._where({}), '');
1616
assert.equal(op._where({ id: 1 }), ' WHERE `id` = 1');
1717
assert.equal(op._where({ id: 1, name: 'foo' }), ' WHERE `id` = 1 AND `name` = \'foo\'');
18-
assert.equal(op._where({ id: 1, name2: null }), ' WHERE `id` = 1 AND `name2` = NULL');
18+
assert.equal(op._where({ id: 1, name2: null }), ' WHERE `id` = 1 AND `name2` IS NULL');
19+
assert.equal(op._where({ id: 1, name3: undefined }), ' WHERE `id` = 1 AND `name3` IS NULL');
1920
assert.equal(op._where({ 'test.id': 1 }), ' WHERE `test`.`id` = 1');
2021
assert.equal(op._where({ id: [ 1, 2 ], name: 'foo' }), ' WHERE `id` IN (1, 2) AND `name` = \'foo\'');
2122
assert.equal(op._where({ id: [ 1 ], name: 'foo' }, [ 'id', 'name' ]), ' WHERE `id` IN (1) AND `name` = \'foo\'');

test/rds_init.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CREATE TABLE IF NOT EXISTS `ali-sdk-test-user` (
44
`gmt_modified` datetime NOT NULL COMMENT 'modified time' DEFAULT NOW(),
55
`name` varchar(100) NOT NULL COMMENT 'user name',
66
`email` varchar(400) NOT NULL,
7+
`mobile` varchar(50) DEFAULT NULL,
78
PRIMARY KEY (`id`),
89
UNIQUE KEY `name` (`name`),
910
KEY `gmt_modified` (`gmt_modified`)

0 commit comments

Comments
 (0)