Skip to content
Merged

Dev #97

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
2 changes: 1 addition & 1 deletion packages/builder/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@sqb/builder",
"description": "Extensible multi-dialect SQL query builder written with TypeScript",
"version": "6.0.2",
"version": "6.0.3",
"author": "Panates",
"private": false,
"license": "Apache-2.0",
Expand Down
4 changes: 2 additions & 2 deletions packages/connect/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@sqb/connect",
"description": "Multi-dialect database connection framework written with TypeScript",
"version": "6.0.2",
"version": "6.0.3",
"author": "Panates",
"license": "Apache-2.0",
"scripts": {
Expand Down Expand Up @@ -44,7 +44,7 @@
"postgrejs": "^2.23.1"
},
"peerDependencies": {
"@sqb/builder": "^6.0.2",
"@sqb/builder": "^6.0.3",
"reflect-metadata": "^0.2.2"
},
"type": "module",
Expand Down
4 changes: 2 additions & 2 deletions packages/mariadb-dialect/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@sqb/mariadb-dialect",
"description": "SQB serialization extension for MariaDB database",
"version": "6.0.2",
"version": "6.0.3",
"author": "Panates",
"license": "Apache-2.0",
"scripts": {
Expand All @@ -24,7 +24,7 @@
"tslib": "^2.8.1"
},
"peerDependencies": {
"@sqb/builder": "^6.0.2"
"@sqb/builder": "^6.0.3"
},
"devDependencies": {
"expect": "^30.4.1"
Expand Down
8 changes: 4 additions & 4 deletions packages/mariadb/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@sqb/mariadb",
"description": "SQB adapter for the mariadb driver",
"version": "6.0.2",
"version": "6.0.3",
"author": "Panates",
"license": "Apache-2.0",
"scripts": {
Expand All @@ -28,9 +28,9 @@
"mariadb": "^3.5.3"
},
"peerDependencies": {
"@sqb/builder": "^6.0.2",
"@sqb/connect": "^6.0.2",
"@sqb/mariadb-dialect": "^6.0.2",
"@sqb/builder": "^6.0.3",
"@sqb/connect": "^6.0.3",
"@sqb/mariadb-dialect": "^6.0.3",
"mariadb": "^3.5.3"
},
"type": "module",
Expand Down
8 changes: 4 additions & 4 deletions packages/migrator/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@sqb/migrator",
"description": "Database migrator for SQB",
"version": "6.0.2",
"version": "6.0.3",
"author": "Panates",
"license": "Apache-2.0",
"scripts": {
Expand All @@ -28,9 +28,9 @@
"tslib": "^2.8.1"
},
"peerDependencies": {
"@sqb/builder": "^6.0.2",
"@sqb/connect": "^6.0.2",
"@sqb/postgres": "^6.0.2"
"@sqb/builder": "^6.0.3",
"@sqb/connect": "^6.0.3",
"@sqb/postgres": "^6.0.3"
},
"devDependencies": {
"expect": "^30.4.1",
Expand Down
4 changes: 2 additions & 2 deletions packages/mssql-dialect/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@sqb/mssql-dialect",
"description": "SQB serialization extension for MS-SQL database",
"version": "6.0.2",
"version": "6.0.3",
"author": "Panates",
"license": "Apache-2.0",
"scripts": {
Expand All @@ -24,7 +24,7 @@
"tslib": "^2.8.1"
},
"peerDependencies": {
"@sqb/builder": "^6.0.2"
"@sqb/builder": "^6.0.3"
},
"devDependencies": {
"expect": "^30.4.1"
Expand Down
8 changes: 4 additions & 4 deletions packages/mssql/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@sqb/mssql",
"description": "SQB adapter for the mssql (tedious) driver",
"version": "6.0.2",
"version": "6.0.3",
"author": "Panates",
"license": "Apache-2.0",
"scripts": {
Expand Down Expand Up @@ -30,9 +30,9 @@
"mssql": "^12.7.0"
},
"peerDependencies": {
"@sqb/builder": "^6.0.2",
"@sqb/connect": "^6.0.2",
"@sqb/mssql-dialect": "^6.0.2",
"@sqb/builder": "^6.0.3",
"@sqb/connect": "^6.0.3",
"@sqb/mssql-dialect": "^6.0.3",
"mssql": "^11.0.0 || ^12.0.0"
},
"type": "module",
Expand Down
25 changes: 20 additions & 5 deletions packages/mssql/src/mssql-connection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ const typeNameMap: Record<string, { dataType: string; jsType: string }> = {
Image: { dataType: 'IMAGE', jsType: 'Buffer' },
};

const NAMED_PARAM_PATTERN = / *:([a-zA-Z_]+)/;
const NAMED_PARAM_PATTERN = /^( *):([a-zA-Z_]\w*)$/;

export class MssqlConnection implements Adapter.Connection {
private intlcon?: ConnectionPool;
Expand Down Expand Up @@ -228,11 +228,26 @@ export class MssqlConnection implements Adapter.Connection {
});
let token: string | null;
let out = '';
let m;
// quotes:true hands back an entire string/double-quoted-identifier
// literal as one token, so a ":name" occurring inside one never
// matches the anchored NAMED_PARAM_PATTERN at all. T-SQL's [bracket]
// identifier quoting isn't a "quote" character the tokenizer knows
// about though (brackets:false), so "[col:name]" comes back as three
// separate tokens ("[col", ":name", "]") - track bracket state
// explicitly so a ":name" inside one isn't mistaken for a param.
let inBracket = false;
while ((token = tokenizer.next())) {
m = NAMED_PARAM_PATTERN.exec(token);
if (m) {
token = '@' + m[1];
const trimmed = token.trim();
if (inBracket) {
if (trimmed.includes(']')) inBracket = false;
} else if (trimmed.startsWith('[')) {
inBracket = true;
} else {
const m = NAMED_PARAM_PATTERN.exec(token);
if (m) {
const [, leading, name] = m;
token = leading + '@' + name;
}
}
out += token;
}
Expand Down
60 changes: 60 additions & 0 deletions packages/mssql/test/mssql-connection.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import type { QueryRequest } from '@sqb/connect';
import { expect } from 'expect';
import { MssqlConnection } from '../src/mssql-connection.js';

describe('mssql:MssqlConnection', () => {
const connection = new MssqlConnection({} as any);

describe('_normalizeNamedParams', () => {
function normalize(sql: string, params?: Record<string, any>) {
const request: QueryRequest = { sql, params };
(connection as any)._normalizeNamedParams(request);
return request;
}

it('should replace a named param with "@name"', () => {
const r = normalize('select :a as a', { a: 1 });
expect(r.sql).toStrictEqual('select @a as a');
});

it('should replace multiple distinct params', () => {
const r = normalize('select :a, :b', { a: 1, b: 2 });
expect(r.sql).toStrictEqual('select @a, @b');
});

it('should replace every occurrence of a repeated param', () => {
const r = normalize('select :a, :b, :a', { a: 1, b: 2 });
expect(r.sql).toStrictEqual('select @a, @b, @a');
});

it('should leave sql untouched when there is no named param', () => {
const r = normalize('select 1');
expect(r.sql).toStrictEqual('select 1');
});

it('should not rewrite the params object itself', () => {
const params = { a: 1 };
const r = normalize('select :a', params);
expect(r.params).toBe(params);
});

it('should not treat ":name" inside a string literal as a param', () => {
const r = normalize("select :a as a, 'literal :notparam text' as lit", {
a: 1,
});
expect(r.sql).toStrictEqual(
"select @a as a, 'literal :notparam text' as lit",
);
});

it('should not treat ":name" inside a double-quoted identifier as a param', () => {
const r = normalize('select :a, "col:name" from t', { a: 1 });
expect(r.sql).toStrictEqual('select @a, "col:name" from t');
});

it('should not treat ":name" inside a bracket-quoted identifier as a param', () => {
const r = normalize('select :a, [col:name] from t', { a: 1 });
expect(r.sql).toStrictEqual('select @a, [col:name] from t');
});
});
});
4 changes: 2 additions & 2 deletions packages/mysql-dialect/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@sqb/mysql-dialect",
"description": "SQB serialization extension for MySQL database",
"version": "6.0.2",
"version": "6.0.3",
"author": "Panates",
"license": "Apache-2.0",
"scripts": {
Expand All @@ -24,7 +24,7 @@
"tslib": "^2.8.1"
},
"peerDependencies": {
"@sqb/builder": "^6.0.2"
"@sqb/builder": "^6.0.3"
},
"devDependencies": {
"expect": "^30.4.1"
Expand Down
8 changes: 4 additions & 4 deletions packages/mysql/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@sqb/mysql",
"description": "SQB adapter for the mysql2 driver",
"version": "6.0.2",
"version": "6.0.3",
"author": "Panates",
"license": "Apache-2.0",
"scripts": {
Expand All @@ -28,9 +28,9 @@
"mysql2": "^3.24.2"
},
"peerDependencies": {
"@sqb/builder": "^6.0.2",
"@sqb/connect": "^6.0.2",
"@sqb/mysql-dialect": "^6.0.2",
"@sqb/builder": "^6.0.3",
"@sqb/connect": "^6.0.3",
"@sqb/mysql-dialect": "^6.0.3",
"mysql2": "^3.24.2"
},
"type": "module",
Expand Down
6 changes: 3 additions & 3 deletions packages/nestjs/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@sqb/nestjs",
"description": "Nestjs module for data connection using SQB",
"version": "6.0.2",
"version": "6.0.3",
"author": "Panates",
"license": "Apache-2.0",
"scripts": {
Expand Down Expand Up @@ -39,8 +39,8 @@
"peerDependencies": {
"@nestjs/common": ">=7.4.0",
"@nestjs/core": ">=7.4.0",
"@sqb/builder": "^6.0.2",
"@sqb/connect": "^6.0.2",
"@sqb/builder": "^6.0.3",
"@sqb/connect": "^6.0.3",
"reflect-metadata": "^0.2.2",
"rxjs": ">=6.6.0"
},
Expand Down
4 changes: 2 additions & 2 deletions packages/oracle-dialect/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@sqb/oracle-dialect",
"description": "SQB serialization extension for Oracle database",
"version": "6.0.2",
"version": "6.0.3",
"author": "Panates",
"license": "Apache-2.0",
"scripts": {
Expand All @@ -25,7 +25,7 @@
"tslib": "^2.8.1"
},
"peerDependencies": {
"@sqb/builder": "^6.0.2"
"@sqb/builder": "^6.0.3"
},
"devDependencies": {
"expect": "^30.4.1"
Expand Down
8 changes: 4 additions & 4 deletions packages/oracle/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@sqb/oracle",
"description": "SQB serialization extension for Oracle database",
"version": "6.0.2",
"version": "6.0.3",
"author": "Panates",
"license": "Apache-2.0",
"scripts": {
Expand All @@ -24,9 +24,9 @@
"tslib": "^2.8.1"
},
"peerDependencies": {
"@sqb/builder": "^6.0.2",
"@sqb/connect": "^6.0.2",
"@sqb/oracle-dialect": "^6.0.2",
"@sqb/builder": "^6.0.3",
"@sqb/connect": "^6.0.3",
"@sqb/oracle-dialect": "^6.0.3",
"oracledb": ">= 6.4.0"
},
"devDependencies": {
Expand Down
4 changes: 2 additions & 2 deletions packages/postgres-dialect/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@sqb/postgres-dialect",
"description": "SQB serialization extension for PostgreSQL database",
"version": "6.0.2",
"version": "6.0.3",
"author": "Panates",
"license": "Apache-2.0",
"scripts": {
Expand All @@ -24,7 +24,7 @@
"tslib": "^2.8.1"
},
"peerDependencies": {
"@sqb/builder": "^6.0.2"
"@sqb/builder": "^6.0.3"
},
"devDependencies": {
"expect": "^30.4.1"
Expand Down
8 changes: 4 additions & 4 deletions packages/postgres/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@sqb/postgres",
"description": "SQB serialization extension for PostgreSQL database",
"version": "6.0.2",
"version": "6.0.3",
"author": "Panates",
"license": "Apache-2.0",
"scripts": {
Expand Down Expand Up @@ -30,9 +30,9 @@
"postgrejs": "^2.22.2"
},
"peerDependencies": {
"@sqb/builder": "^6.0.2",
"@sqb/connect": "^6.0.2",
"@sqb/postgres-dialect": "^6.0.2",
"@sqb/builder": "^6.0.3",
"@sqb/connect": "^6.0.3",
"@sqb/postgres-dialect": "^6.0.3",
"postgrejs": ">=2.15.1 <3.0.0"
},
"type": "module",
Expand Down
Loading