Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -259,11 +259,16 @@
* indexes come from the parsedSql object and a given parameter may
* appear in multiple positions.
*/
function convertParamValues(parsedSql, values) {
function convertParamValues(parsedSql, values, addUndefinedNamedParameters) {
var ret = [];
_.each(parsedSql.params, function(param) {
if( !_.has(values, param.name) ) {
throw new Error("No value found for parameter: " + param.name);
if(addUndefinedNamedParameters){
values[param.name] = null;
}
else{
throw new Error("No value found for parameter: " + param.name);
}
}
ret.push(values[param.name]);
});
Expand All @@ -288,7 +293,7 @@

// Add named parameter support to Client.query:
var origQuery = pg.Client.prototype.query;
pg.Client.prototype.query = function(config, values, callback) {
pg.Client.prototype.query = function(config, values, callback, addUndefinedNamedParameters) {
var sql;
if( _.isString(config) ) {
sql = config;
Expand All @@ -304,8 +309,8 @@
throw new Error("First parameter of query() must be a string or config object with a name property");
}
var parsedSql = parseSql(sql);
debug.main("parsed sql:", parsedSql);
var params = convertParamValues(parsedSql, values);
debug.main("parsed sql:", parsedSql);
var params = convertParamValues(parsedSql, values, addUndefinedNamedParameters);
debug.main("parsed params:", params);
return origQuery.apply(this, [parsedSql.sql, params, callback]);
} catch( err ) {
Expand All @@ -326,4 +331,4 @@
"parseSql": parseSql,
"convertParamValues": convertParamValues
};
})();
})();
16 changes: 14 additions & 2 deletions test/lib/parse-tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module.exports = function(spice) {
var sql = opts.sql,
expectedSql = opts.expectedSql || sql,
values = opts.values || {},
addUndefinedNamedParameters = opts.addUndefinedNamedParameters,
expectedNumParams = opts.expectedNumParams || _.size(_.keys(opts.values));
it('should match the expected parsed SQL', function() {
var parsed = spice.parseSql(sql);
Expand All @@ -14,19 +15,20 @@ module.exports = function(spice) {

it('should match the expected number of parameters', function() {
var parsed = spice.parseSql(sql),
params = spice.convertParamValues(parsed, values);
params = spice.convertParamValues(parsed, values, addUndefinedNamedParameters);
assert.equal(params.length, expectedNumParams);
});
}

function testInvalid(opts) {
var text = opts.name || 'should throw an error',
sql = opts.sql,
addUndefinedNamedParameters = opts.addUndefinedNamedParameters,
values = opts.values || {};
it(text, function() {
assert.throws(function() {
var parsed = spice.parseSql(sql),
params = spice.convertParamValues(parsed, values);
params = spice.convertParamValues(parsed, values, addUndefinedNamedParameters);
});
});
}
Expand Down Expand Up @@ -84,6 +86,16 @@ module.exports = function(spice) {
});
});

describe('Parse SQL missing parameter value as null', function() {
testValid({
sql: 'SELECT :foo',
values: {},
expectedSql:'SELECT $1',
addUndefinedNamedParameters: true,
expectedNumParams : 1
});
});

describe('Parse SQL with existing numbered parameters', function() {
testInvalid({
sql: 'SELECT :foo, $1',
Expand Down