From b513488f42e99677c3a65749675f1d89e949ba54 Mon Sep 17 00:00:00 2001 From: Alex Shumsky Date: Mon, 15 Nov 2021 11:24:36 +0300 Subject: [PATCH 1/3] Add support for numbered placeholders --- src/better_sqlite3.cpp | 3 ++- src/util/binder.lzz | 3 ++- test/24.statement.bind.js | 7 +++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/better_sqlite3.cpp b/src/better_sqlite3.cpp index 93fc14b76..57ceb4f11 100644 --- a/src/better_sqlite3.cpp +++ b/src/better_sqlite3.cpp @@ -1961,7 +1961,8 @@ void Binder::Fail (void (* Throw) (char const *), char const * message) int Binder::NextAnonIndex () #line 52 "./src/util/binder.lzz" { - while (sqlite3_bind_parameter_name(handle, ++anon_index) != NULL) {} + const char* name; + while ((name = sqlite3_bind_parameter_name(handle, ++anon_index)) != NULL && name[0] != '?') {} return anon_index; } #line 58 "./src/util/binder.lzz" diff --git a/src/util/binder.lzz b/src/util/binder.lzz index c7deb1c98..f3b16f955 100644 --- a/src/util/binder.lzz +++ b/src/util/binder.lzz @@ -50,7 +50,8 @@ private: } int NextAnonIndex() { - while (sqlite3_bind_parameter_name(handle, ++anon_index) != NULL) {} + const char* name; + while ((name = sqlite3_bind_parameter_name(handle, ++anon_index)) != NULL && name[0] != '?') {} return anon_index; } diff --git a/test/24.statement.bind.js b/test/24.statement.bind.js index 404b27d04..f99ee12ac 100644 --- a/test/24.statement.bind.js +++ b/test/24.statement.bind.js @@ -104,4 +104,11 @@ describe('Statement#bind()', function () { expect(result).to.be.a('string'); expect(result.length).to.equal(0); }); + it('should accept numbered placeholders', function () { + const result = this.db.prepare('SELECT ?, ?, ?1, ?').bind(1, 2, 3).raw().get(); + expect(result).to.deep.equal([1, 2, 1, 3]); + + const result2 = this.db.prepare('SELECT ?3, ?2, ?1').bind('a', 'b', 'c').raw().get(); + expect(result2).to.deep.equal(['c', 'b', 'a']); + }); }); From cd6830c518a72fc69989bdeaa378ea8f6d716046 Mon Sep 17 00:00:00 2001 From: Alex Shumsky Date: Thu, 25 Nov 2021 19:23:05 +0300 Subject: [PATCH 2/3] Add more testcases for numbered placeholders --- test/24.statement.bind.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/24.statement.bind.js b/test/24.statement.bind.js index f99ee12ac..ce3083f34 100644 --- a/test/24.statement.bind.js +++ b/test/24.statement.bind.js @@ -110,5 +110,14 @@ describe('Statement#bind()', function () { const result2 = this.db.prepare('SELECT ?3, ?2, ?1').bind('a', 'b', 'c').raw().get(); expect(result2).to.deep.equal(['c', 'b', 'a']); + + const result3 = this.db.prepare('SELECT ?2, ?1, ?, ?5').bind(1, 2, 3, 4, 5).raw().get(); + expect(result3).to.deep.equal([2, 1, 3, 5]); + + const result4 = this.db.prepare('SELECT ?2, ?, ?5').bind([1, 2, 3, 4, 5]).raw().get(); + expect(result4).to.deep.equal([2, 3, 5]); + + const result5 = this.db.prepare('SELECT ?2, ?, ?5').bind([1, 2, 3], [4, 5]).raw().get(); + expect(result5).to.deep.equal([2, 3, 5]); }); }); From 4c93cb64e11bf14d921121304d0ada1e3d2a1326 Mon Sep 17 00:00:00 2001 From: Alex Shumsky Date: Thu, 25 Nov 2021 19:29:50 +0300 Subject: [PATCH 3/3] Fix indentation --- test/24.statement.bind.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/24.statement.bind.js b/test/24.statement.bind.js index ce3083f34..6f9596bcd 100644 --- a/test/24.statement.bind.js +++ b/test/24.statement.bind.js @@ -111,13 +111,13 @@ describe('Statement#bind()', function () { const result2 = this.db.prepare('SELECT ?3, ?2, ?1').bind('a', 'b', 'c').raw().get(); expect(result2).to.deep.equal(['c', 'b', 'a']); - const result3 = this.db.prepare('SELECT ?2, ?1, ?, ?5').bind(1, 2, 3, 4, 5).raw().get(); + const result3 = this.db.prepare('SELECT ?2, ?1, ?, ?5').bind(1, 2, 3, 4, 5).raw().get(); expect(result3).to.deep.equal([2, 1, 3, 5]); - const result4 = this.db.prepare('SELECT ?2, ?, ?5').bind([1, 2, 3, 4, 5]).raw().get(); + const result4 = this.db.prepare('SELECT ?2, ?, ?5').bind([1, 2, 3, 4, 5]).raw().get(); expect(result4).to.deep.equal([2, 3, 5]); - const result5 = this.db.prepare('SELECT ?2, ?, ?5').bind([1, 2, 3], [4, 5]).raw().get(); + const result5 = this.db.prepare('SELECT ?2, ?, ?5').bind([1, 2, 3], [4, 5]).raw().get(); expect(result5).to.deep.equal([2, 3, 5]); }); });