Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix FOR UPDATE OF with explicit schema #5791

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 3 additions & 20 deletions lib/dialects/postgres/query/pg-querycompiler.js
Expand Up @@ -197,29 +197,12 @@ class QueryCompiler_PG extends QueryCompiler {
}
}

// Join array of table names and apply default schema.
_tableNames(tables) {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When the _tableNames helper was written (#2835) there were multiple methods hitting it, but they've since been merged into the single _lockingClause method. Given that the only really interesting thing it was doing was prepending the schema name--which is the incorrect behavior this commit fixes--it didn't seem worth keeping at this point.

const schemaName = this.single.schema;
const sql = [];

for (let i = 0; i < tables.length; i++) {
let tableName = tables[i];

if (tableName) {
if (schemaName) {
tableName = `${schemaName}.${tableName}`;
}
sql.push(this.formatter.wrap(tableName));
}
}

return sql.join(', ');
}

_lockingClause(lockMode) {
const tables = this.single.lockTables || [];

return lockMode + (tables.length ? ' of ' + this._tableNames(tables) : '');
return lockMode + (tables.length
? ' of ' + tables.filter(Boolean).map(table => this.formatter.wrap(table)).join(', ')
: '');
}

_groupOrder(item, type) {
Expand Down
3 changes: 2 additions & 1 deletion test/integration2/query/select/selects.spec.js
Expand Up @@ -993,7 +993,7 @@ describe('Selects', function () {
try {
await knex.transaction((trx) => {
// select all from two test tables and lock only one table
return trx('test_default_table')
return trx.withSchema('public').from('test_default_table')
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure you'd say .withSchema('public') in a real query but it lets me exercise the behavior in question without having to learn enough about knex's test environment to stand up a discrete schema 😁

.innerJoin(
'test_default_table2',
'test_default_table.tinyint',
Expand All @@ -1010,6 +1010,7 @@ describe('Selects', function () {
});
});
} catch (err) {
console.log(err.message);
expect(err.message).to.be.contain(
'Defined query timeout of 100ms exceeded when running query'
);
Expand Down