diff --git a/sql-bricks.js b/sql-bricks.js index 037186a..98891d8 100644 --- a/sql-bricks.js +++ b/sql-bricks.js @@ -23,6 +23,10 @@ if (_.isArray(this.vals[0])) this.vals = this.vals[0]; } + sql.prototype.clone = function clone() { + var args = [this.str].concat(this.vals); + return sql.apply(null, args); + }; sql.setDefaultOpts = setDefaultOpts; function setDefaultOpts(opts) { default_opts = _.extend(default_opts, opts); diff --git a/tests/tests.js b/tests/tests.js index 793ddef..1d2c706 100644 --- a/tests/tests.js +++ b/tests/tests.js @@ -948,6 +948,15 @@ describe('SQL Bricks', function() { sel.clone().where('last_name', 'Flintstone'); check(sel, "SELECT * FROM \"user\" WHERE first_name IN (SELECT first_name FROM \"user\")"); }); + it('should clone parameterized sub-expressions', function() { + checkParams(select().from('tbl').where(or(sql('a = $1', 444), sql('b = $1', 555), sql('c = $1', 666))).clone(), + 'SELECT * FROM tbl WHERE a = $1 OR b = $2 OR c = $3', + [444, 555, 666]); + }); + it('should clone non-parameterized sub-expressions', function() { + check(select().from('tbl').where(or(sql('a = 444'), sql('b = 555'), sql('c = 666'))).clone(), + 'SELECT * FROM tbl WHERE a = 444 OR b = 555 OR c = 666'); + }); }); describe('the AS keyword', function() {