kysely 0.28.13 → 0.28.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,5 +9,13 @@ export declare class MysqlQueryCompiler extends DefaultQueryCompiler {
9
9
  protected getLeftIdentifierWrapper(): string;
10
10
  protected getRightIdentifierWrapper(): string;
11
11
  protected sanitizeIdentifier(identifier: string): string;
12
+ /**
13
+ * MySQL requires escaping backslashes in string literals when using the
14
+ * default NO_BACKSLASH_ESCAPES=OFF mode. Without this, a backslash
15
+ * followed by a quote (\') can break out of the string literal.
16
+ *
17
+ * @see https://dev.mysql.com/doc/refman/9.6/en/string-literals.html
18
+ */
19
+ protected sanitizeStringLiteral(value: string): string;
12
20
  protected visitCreateIndex(node: CreateIndexNode): void;
13
21
  }
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MysqlQueryCompiler = void 0;
4
4
  const default_query_compiler_js_1 = require("../../query-compiler/default-query-compiler.js");
5
+ const LITERAL_ESCAPE_REGEX = /\\|'/g;
5
6
  const ID_WRAP_REGEX = /`/g;
6
7
  class MysqlQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompiler {
7
8
  getCurrentParameterPlaceholder() {
@@ -20,14 +21,24 @@ class MysqlQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompile
20
21
  return '';
21
22
  }
22
23
  getLeftIdentifierWrapper() {
23
- return '`';
24
+ return ID_WRAP_REGEX.source;
24
25
  }
25
26
  getRightIdentifierWrapper() {
26
- return '`';
27
+ return ID_WRAP_REGEX.source;
27
28
  }
28
29
  sanitizeIdentifier(identifier) {
29
30
  return identifier.replace(ID_WRAP_REGEX, '``');
30
31
  }
32
+ /**
33
+ * MySQL requires escaping backslashes in string literals when using the
34
+ * default NO_BACKSLASH_ESCAPES=OFF mode. Without this, a backslash
35
+ * followed by a quote (\') can break out of the string literal.
36
+ *
37
+ * @see https://dev.mysql.com/doc/refman/9.6/en/string-literals.html
38
+ */
39
+ sanitizeStringLiteral(value) {
40
+ return value.replace(LITERAL_ESCAPE_REGEX, (char) => char === '\\' ? '\\\\' : "''");
41
+ }
31
42
  visitCreateIndex(node) {
32
43
  this.append('create ');
33
44
  if (node.unique) {
@@ -28,6 +28,14 @@ export declare class CaseThenBuilder<DB, TB extends keyof DB, W, O> {
28
28
  *
29
29
  * A `then` call can be followed by {@link Whenable.when}, {@link CaseWhenBuilder.else},
30
30
  * {@link CaseWhenBuilder.end} or {@link CaseWhenBuilder.endCase} call.
31
+ *
32
+ * **Note:** Numbers, booleans, and `null` values are inlined directly into the
33
+ * SQL query string (e.g. `then 1`, `then true`, `then null`) instead of being
34
+ * added as parameterized values (e.g. `then $1`). This allows the database
35
+ * engine to correctly infer the data type of the `case` expression result.
36
+ * Without this behavior, all results would be returned as strings.
37
+ *
38
+ * String values are always parameterized as usual.
31
39
  */
32
40
  then<E extends Expression<unknown>>(expression: E): CaseWhenBuilder<DB, TB, W, O | ExtractTypeFromValueExpression<E>>;
33
41
  then<V>(value: V): CaseWhenBuilder<DB, TB, W, O | V>;
@@ -47,6 +55,14 @@ export declare class CaseWhenBuilder<DB, TB extends keyof DB, W, O> implements W
47
55
  * Adds an `else` clause to the `case` statement.
48
56
  *
49
57
  * An `else` call must be followed by an {@link Endable.end} or {@link Endable.endCase} call.
58
+ *
59
+ * **Note:** Numbers, booleans, and `null` values are inlined directly into the
60
+ * SQL query string (e.g. `else 0`, `else false`, `else null`) instead of being
61
+ * added as parameterized values (e.g. `else $1`). This allows the database
62
+ * engine to correctly infer the data type of the `case` expression result.
63
+ * Without this behavior, all results would be returned as strings.
64
+ *
65
+ * String values are always parameterized as usual.
50
66
  */
51
67
  else<E extends Expression<unknown>>(expression: E): CaseEndBuilder<DB, TB, O | ExtractTypeFromValueExpression<E>>;
52
68
  else<V>(value: V): CaseEndBuilder<DB, TB, O | V>;
@@ -9,5 +9,13 @@ export declare class MysqlQueryCompiler extends DefaultQueryCompiler {
9
9
  protected getLeftIdentifierWrapper(): string;
10
10
  protected getRightIdentifierWrapper(): string;
11
11
  protected sanitizeIdentifier(identifier: string): string;
12
+ /**
13
+ * MySQL requires escaping backslashes in string literals when using the
14
+ * default NO_BACKSLASH_ESCAPES=OFF mode. Without this, a backslash
15
+ * followed by a quote (\') can break out of the string literal.
16
+ *
17
+ * @see https://dev.mysql.com/doc/refman/9.6/en/string-literals.html
18
+ */
19
+ protected sanitizeStringLiteral(value: string): string;
12
20
  protected visitCreateIndex(node: CreateIndexNode): void;
13
21
  }
@@ -1,5 +1,6 @@
1
1
  /// <reference types="./mysql-query-compiler.d.ts" />
2
2
  import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
3
+ const LITERAL_ESCAPE_REGEX = /\\|'/g;
3
4
  const ID_WRAP_REGEX = /`/g;
4
5
  export class MysqlQueryCompiler extends DefaultQueryCompiler {
5
6
  getCurrentParameterPlaceholder() {
@@ -18,14 +19,24 @@ export class MysqlQueryCompiler extends DefaultQueryCompiler {
18
19
  return '';
19
20
  }
20
21
  getLeftIdentifierWrapper() {
21
- return '`';
22
+ return ID_WRAP_REGEX.source;
22
23
  }
23
24
  getRightIdentifierWrapper() {
24
- return '`';
25
+ return ID_WRAP_REGEX.source;
25
26
  }
26
27
  sanitizeIdentifier(identifier) {
27
28
  return identifier.replace(ID_WRAP_REGEX, '``');
28
29
  }
30
+ /**
31
+ * MySQL requires escaping backslashes in string literals when using the
32
+ * default NO_BACKSLASH_ESCAPES=OFF mode. Without this, a backslash
33
+ * followed by a quote (\') can break out of the string literal.
34
+ *
35
+ * @see https://dev.mysql.com/doc/refman/9.6/en/string-literals.html
36
+ */
37
+ sanitizeStringLiteral(value) {
38
+ return value.replace(LITERAL_ESCAPE_REGEX, (char) => char === '\\' ? '\\\\' : "''");
39
+ }
29
40
  visitCreateIndex(node) {
30
41
  this.append('create ');
31
42
  if (node.unique) {
@@ -28,6 +28,14 @@ export declare class CaseThenBuilder<DB, TB extends keyof DB, W, O> {
28
28
  *
29
29
  * A `then` call can be followed by {@link Whenable.when}, {@link CaseWhenBuilder.else},
30
30
  * {@link CaseWhenBuilder.end} or {@link CaseWhenBuilder.endCase} call.
31
+ *
32
+ * **Note:** Numbers, booleans, and `null` values are inlined directly into the
33
+ * SQL query string (e.g. `then 1`, `then true`, `then null`) instead of being
34
+ * added as parameterized values (e.g. `then $1`). This allows the database
35
+ * engine to correctly infer the data type of the `case` expression result.
36
+ * Without this behavior, all results would be returned as strings.
37
+ *
38
+ * String values are always parameterized as usual.
31
39
  */
32
40
  then<E extends Expression<unknown>>(expression: E): CaseWhenBuilder<DB, TB, W, O | ExtractTypeFromValueExpression<E>>;
33
41
  then<V>(value: V): CaseWhenBuilder<DB, TB, W, O | V>;
@@ -47,6 +55,14 @@ export declare class CaseWhenBuilder<DB, TB extends keyof DB, W, O> implements W
47
55
  * Adds an `else` clause to the `case` statement.
48
56
  *
49
57
  * An `else` call must be followed by an {@link Endable.end} or {@link Endable.endCase} call.
58
+ *
59
+ * **Note:** Numbers, booleans, and `null` values are inlined directly into the
60
+ * SQL query string (e.g. `else 0`, `else false`, `else null`) instead of being
61
+ * added as parameterized values (e.g. `else $1`). This allows the database
62
+ * engine to correctly infer the data type of the `case` expression result.
63
+ * Without this behavior, all results would be returned as strings.
64
+ *
65
+ * String values are always parameterized as usual.
50
66
  */
51
67
  else<E extends Expression<unknown>>(expression: E): CaseEndBuilder<DB, TB, O | ExtractTypeFromValueExpression<E>>;
52
68
  else<V>(value: V): CaseEndBuilder<DB, TB, O | V>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kysely",
3
- "version": "0.28.13",
3
+ "version": "0.28.14",
4
4
  "description": "Type safe SQL query builder",
5
5
  "repository": {
6
6
  "type": "git",