@askdb/core 1.0.0-beta.42 → 1.0.0-beta.43

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.
Files changed (85) hide show
  1. package/README.md +6 -4
  2. package/dist/ask.d.ts +92 -4
  3. package/dist/ask.d.ts.map +1 -1
  4. package/dist/ask.js +234 -23
  5. package/dist/ask.js.map +1 -1
  6. package/dist/errors.d.ts +41 -5
  7. package/dist/errors.d.ts.map +1 -1
  8. package/dist/errors.js +9 -0
  9. package/dist/errors.js.map +1 -1
  10. package/dist/index.d.ts +5 -4
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/schema/v2/index.d.ts +1 -1
  15. package/dist/schema/v2/index.d.ts.map +1 -1
  16. package/dist/schema/v2/loader.d.ts +9 -1
  17. package/dist/schema/v2/loader.d.ts.map +1 -1
  18. package/dist/schema/v2/loader.js +171 -49
  19. package/dist/schema/v2/loader.js.map +1 -1
  20. package/dist/schema/v2/normalized.d.ts +33 -0
  21. package/dist/schema/v2/normalized.d.ts.map +1 -1
  22. package/dist/schema/v2/parser.d.ts +9 -0
  23. package/dist/schema/v2/parser.d.ts.map +1 -1
  24. package/dist/schema/v2/parser.js +18 -2
  25. package/dist/schema/v2/parser.js.map +1 -1
  26. package/dist/schema/v2/tenant-policy-loader.d.ts.map +1 -1
  27. package/dist/schema/v2/tenant-policy-loader.js +7 -3
  28. package/dist/schema/v2/tenant-policy-loader.js.map +1 -1
  29. package/dist/schema/v2/tenant-policy.d.ts +28 -21
  30. package/dist/schema/v2/tenant-policy.d.ts.map +1 -1
  31. package/dist/schema/v2/tenant-policy.js +67 -11
  32. package/dist/schema/v2/tenant-policy.js.map +1 -1
  33. package/dist/sql/bind.d.ts +17 -15
  34. package/dist/sql/bind.d.ts.map +1 -1
  35. package/dist/sql/bind.js +34 -172
  36. package/dist/sql/bind.js.map +1 -1
  37. package/dist/sql/dialect-spec.d.ts +21 -2
  38. package/dist/sql/dialect-spec.d.ts.map +1 -1
  39. package/dist/sql/dialect-spec.js +74 -3
  40. package/dist/sql/dialect-spec.js.map +1 -1
  41. package/dist/sql/generate.d.ts +12 -0
  42. package/dist/sql/generate.d.ts.map +1 -1
  43. package/dist/sql/generate.js +24 -16
  44. package/dist/sql/generate.js.map +1 -1
  45. package/dist/sql/lexer.d.ts +114 -0
  46. package/dist/sql/lexer.d.ts.map +1 -0
  47. package/dist/sql/lexer.js +397 -0
  48. package/dist/sql/lexer.js.map +1 -0
  49. package/dist/sql/sensitive-guardrail.d.ts +18 -3
  50. package/dist/sql/sensitive-guardrail.d.ts.map +1 -1
  51. package/dist/sql/sensitive-guardrail.js +440 -153
  52. package/dist/sql/sensitive-guardrail.js.map +1 -1
  53. package/dist/sql/tenant-guardrail.d.ts +70 -8
  54. package/dist/sql/tenant-guardrail.d.ts.map +1 -1
  55. package/dist/sql/tenant-guardrail.js +799 -52
  56. package/dist/sql/tenant-guardrail.js.map +1 -1
  57. package/dist/sql/tenant-hierarchy.d.ts +19 -0
  58. package/dist/sql/tenant-hierarchy.d.ts.map +1 -0
  59. package/dist/sql/tenant-hierarchy.js +53 -0
  60. package/dist/sql/tenant-hierarchy.js.map +1 -0
  61. package/dist/sql/tenant-placeholders.d.ts +60 -10
  62. package/dist/sql/tenant-placeholders.d.ts.map +1 -1
  63. package/dist/sql/tenant-placeholders.js +229 -58
  64. package/dist/sql/tenant-placeholders.js.map +1 -1
  65. package/dist/sql/tenant-prompt.d.ts +4 -0
  66. package/dist/sql/tenant-prompt.d.ts.map +1 -1
  67. package/dist/sql/tenant-prompt.js +79 -11
  68. package/dist/sql/tenant-prompt.js.map +1 -1
  69. package/dist/sql/tenant-scope-validate.d.ts +3 -1
  70. package/dist/sql/tenant-scope-validate.d.ts.map +1 -1
  71. package/dist/sql/tenant-scope-validate.js +5 -2
  72. package/dist/sql/tenant-scope-validate.js.map +1 -1
  73. package/dist/sql/validate.d.ts +24 -4
  74. package/dist/sql/validate.d.ts.map +1 -1
  75. package/dist/sql/validate.js +123 -37
  76. package/dist/sql/validate.js.map +1 -1
  77. package/package.json +6 -5
  78. package/dist/exec/postgres.d.ts +0 -6
  79. package/dist/exec/postgres.d.ts.map +0 -1
  80. package/dist/exec/postgres.js +0 -30
  81. package/dist/exec/postgres.js.map +0 -1
  82. package/dist/modes/post-execute-log.d.ts +0 -9
  83. package/dist/modes/post-execute-log.d.ts.map +0 -1
  84. package/dist/modes/post-execute-log.js +0 -26
  85. package/dist/modes/post-execute-log.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/sql/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/sql/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Dialect-aware SQL lexer shared by the read-only validator, the sensitive-identifier
3
+ * guardrail, and the placeholder scanner.
4
+ *
5
+ * It only splits SQL into tokens — it does not parse. Its job is to agree with the
6
+ * target engine about where strings, quoted identifiers, and comments begin and end,
7
+ * because every downstream check ("is there a second statement?", "is `DELETE` a
8
+ * keyword here?", "is `ssn` a column reference?") depends on that boundary. Rules per
9
+ * engine:
10
+ *
11
+ * | Construct | Postgres | MySQL/MariaDB | SQL Server | SQLite |
12
+ * |---------------------------|----------|------------------------|------------|--------|
13
+ * | `'…'` backslash escapes | no | yes (`backslashEscapes`) | no | no |
14
+ * | `E'…'` backslash escapes | yes | — | — | — |
15
+ * | `$tag$…$tag$` | yes | — | — | — |
16
+ * | `"…"` | ident | string | ident | ident |
17
+ * | `` `…` `` | — | ident | — | ident |
18
+ * | `[…]` | — | — | ident (`]]`) | ident |
19
+ * | `#` line comment | — | yes | — | — |
20
+ * | `--` line comment | yes | only before whitespace | yes | yes |
21
+ * | nested `/* … *\/` | yes | no (`/*! … *\/` runs) | yes | no |
22
+ *
23
+ * The lexer never throws: a string, quoted identifier, or comment that runs off the end
24
+ * of the input is returned with `unterminated: true` so callers can fail closed.
25
+ */
26
+ import type { DialectSpec } from "./dialect-spec.js";
27
+ export type SqlLexerProfileId = "postgres" | "mysql" | "sqlserver" | "sqlite" | "generic";
28
+ export type SqlLexerProfile = {
29
+ id: SqlLexerProfileId;
30
+ /** `'…'` (and MySQL `"…"`) treat backslash as an escape character. */
31
+ backslashEscapes: boolean;
32
+ /** Whether `"…"` is a quoted identifier (ANSI) or a string literal (MySQL default mode). */
33
+ doubleQuote: "identifier" | "string";
34
+ backtickIdentifiers: boolean;
35
+ /** `[…]` quoted identifiers. `"doubled"` accepts `]]` as an escaped `]` (SQL Server). */
36
+ bracketIdentifiers: false | "simple" | "doubled";
37
+ /** Postgres `$tag$ … $tag$` strings. */
38
+ dollarQuotes: boolean;
39
+ /** Postgres `E'…'` strings with backslash escapes. */
40
+ escapeStrings: boolean;
41
+ /** MySQL `#` line comments. */
42
+ hashComments: boolean;
43
+ /** MySQL: `--` starts a comment only when followed by whitespace, a control char, or EOF. */
44
+ dashCommentNeedsSpace: boolean;
45
+ nestedBlockComments: boolean;
46
+ /** MySQL/MariaDB `/*! … *\/` and `/*M! … *\/`: the body is executed, so it is lexed as code. */
47
+ executableComments: boolean;
48
+ /** `@name` / `@@name` variables and parameters. Off for Postgres, where `@` is an operator. */
49
+ atVariables: boolean;
50
+ /** SQL Server `#temp` / `##temp` table names. */
51
+ hashIdentifiers: boolean;
52
+ };
53
+ export declare const POSTGRES_LEXER: SqlLexerProfile;
54
+ export declare const MYSQL_LEXER: SqlLexerProfile;
55
+ export declare const SQLSERVER_LEXER: SqlLexerProfile;
56
+ export declare const SQLITE_LEXER: SqlLexerProfile;
57
+ /**
58
+ * Dialect-agnostic profile for callers that have no dialect (the tenant placeholder
59
+ * path, the sensitive guardrail when no dialect is supplied). Recognizes the union of
60
+ * quoting forms — `'…'`, `E'…'`, `$tag$…$tag$`, `"…"`, `` `…` ``, `[…]` — with the
61
+ * escape rules the owning engine uses, and standard `--` / `/* *\/` comments.
62
+ */
63
+ export declare const GENERIC_LEXER: SqlLexerProfile;
64
+ /** Every engine-specific profile. Used when the dialect is unknown and each reading must be safe. */
65
+ export declare const ENGINE_LEXER_PROFILES: readonly SqlLexerProfile[];
66
+ /**
67
+ * The lexer profile for a dialect, or `undefined` when the id is not a built-in engine
68
+ * family (callers should then check every profile in {@link ENGINE_LEXER_PROFILES}).
69
+ *
70
+ * `backslashEscapes` on the spec is honored: MySQL with `NO_BACKSLASH_ESCAPES` sets it
71
+ * to `false`; Postgres with `standard_conforming_strings = off` sets it to `true`.
72
+ * An unset value on a MySQL-family spec means the server default (escapes on).
73
+ */
74
+ export declare function lexerProfileFor(dialect: Pick<DialectSpec, "id" | "backslashEscapes">): SqlLexerProfile | undefined;
75
+ export type SqlTokenKind =
76
+ /** Unquoted identifier or keyword. */
77
+ "word" | "quoted_identifier" | "string" | "number"
78
+ /** `$1`, `:name`, `@name`, `@@name`. */
79
+ | "parameter"
80
+ /** Any other single character, plus `::`. Includes `(`, `)`, `,`, `.`, `;`. */
81
+ | "punct" | "comment";
82
+ export type SqlToken = {
83
+ kind: SqlTokenKind;
84
+ /** Exact source text of the token. */
85
+ text: string;
86
+ /**
87
+ * `word`: the text as written. `quoted_identifier`: the unescaped name.
88
+ * Everything else: same as `text`.
89
+ */
90
+ value: string;
91
+ /** Lower-cased `value`, for case-insensitive keyword and name matching. */
92
+ lower: string;
93
+ start: number;
94
+ end: number;
95
+ /** Opening delimiter for strings and quoted identifiers (`'`, `"`, `` ` ``, `[`, `$tag$`). */
96
+ quote?: string;
97
+ /**
98
+ * The closing delimiter was never found; the token runs to the end of the input. On a
99
+ * MySQL `/*!` opener it means the matching `*\/` never came (the body is still lexed
100
+ * as code after it).
101
+ */
102
+ unterminated?: true;
103
+ };
104
+ /**
105
+ * Whether the `--` at `i` starts a line comment. It always does, except on MySQL/MariaDB
106
+ * (`needsSpace`), where it must be followed by whitespace, a control character, or the end
107
+ * of the statement: there `--1` is two minus signs and a number.
108
+ */
109
+ export declare function startsDashComment(sql: string, i: number, needsSpace: boolean): boolean;
110
+ /** Split `sql` into tokens under `profile`. Whitespace is dropped; comments are kept. */
111
+ export declare function lexSql(sql: string, profile: SqlLexerProfile): SqlToken[];
112
+ /** True when any token ran off the end of the input. */
113
+ export declare function hasUnterminatedToken(tokens: readonly SqlToken[]): boolean;
114
+ //# sourceMappingURL=lexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../../src/sql/lexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE1F,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,iBAAiB,CAAC;IACtB,sEAAsE;IACtE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,4FAA4F;IAC5F,WAAW,EAAE,YAAY,GAAG,QAAQ,CAAC;IACrC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,yFAAyF;IACzF,kBAAkB,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACjD,wCAAwC;IACxC,YAAY,EAAE,OAAO,CAAC;IACtB,sDAAsD;IACtD,aAAa,EAAE,OAAO,CAAC;IACvB,+BAA+B;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,6FAA6F;IAC7F,qBAAqB,EAAE,OAAO,CAAC;IAC/B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gGAAgG;IAChG,kBAAkB,EAAE,OAAO,CAAC;IAC5B,+FAA+F;IAC/F,WAAW,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,eAc5B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,eAczB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,eAc7B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAc1B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,eAc3B,CAAC;AAEF,qGAAqG;AACrG,eAAO,MAAM,qBAAqB,EAAE,SAAS,eAAe,EAK3D,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,kBAAkB,CAAC,GACpD,eAAe,GAAG,SAAS,CAmB7B;AAED,MAAM,MAAM,YAAY;AACtB,sCAAsC;AACpC,MAAM,GACN,mBAAmB,GACnB,QAAQ,GACR,QAAQ;AACV,wCAAwC;GACtC,WAAW;AACb,+EAA+E;GAC7E,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,YAAY,CAAC,EAAE,IAAI,CAAC;CACrB,CAAC;AAQF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAItF;AAED,yFAAyF;AACzF,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,QAAQ,EAAE,CAsQxE;AAED,wDAAwD;AACxD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAEzE"}
@@ -0,0 +1,397 @@
1
+ export const POSTGRES_LEXER = {
2
+ id: "postgres",
3
+ backslashEscapes: false,
4
+ doubleQuote: "identifier",
5
+ backtickIdentifiers: false,
6
+ bracketIdentifiers: false,
7
+ dollarQuotes: true,
8
+ escapeStrings: true,
9
+ hashComments: false,
10
+ dashCommentNeedsSpace: false,
11
+ nestedBlockComments: true,
12
+ executableComments: false,
13
+ atVariables: false,
14
+ hashIdentifiers: false,
15
+ };
16
+ export const MYSQL_LEXER = {
17
+ id: "mysql",
18
+ backslashEscapes: true,
19
+ doubleQuote: "string",
20
+ backtickIdentifiers: true,
21
+ bracketIdentifiers: false,
22
+ dollarQuotes: false,
23
+ escapeStrings: false,
24
+ hashComments: true,
25
+ dashCommentNeedsSpace: true,
26
+ nestedBlockComments: false,
27
+ executableComments: true,
28
+ atVariables: true,
29
+ hashIdentifiers: false,
30
+ };
31
+ export const SQLSERVER_LEXER = {
32
+ id: "sqlserver",
33
+ backslashEscapes: false,
34
+ doubleQuote: "identifier",
35
+ backtickIdentifiers: false,
36
+ bracketIdentifiers: "doubled",
37
+ dollarQuotes: false,
38
+ escapeStrings: false,
39
+ hashComments: false,
40
+ dashCommentNeedsSpace: false,
41
+ nestedBlockComments: true,
42
+ executableComments: false,
43
+ atVariables: true,
44
+ hashIdentifiers: true,
45
+ };
46
+ export const SQLITE_LEXER = {
47
+ id: "sqlite",
48
+ backslashEscapes: false,
49
+ doubleQuote: "identifier",
50
+ backtickIdentifiers: true,
51
+ bracketIdentifiers: "simple",
52
+ dollarQuotes: false,
53
+ escapeStrings: false,
54
+ hashComments: false,
55
+ dashCommentNeedsSpace: false,
56
+ nestedBlockComments: false,
57
+ executableComments: false,
58
+ atVariables: true,
59
+ hashIdentifiers: false,
60
+ };
61
+ /**
62
+ * Dialect-agnostic profile for callers that have no dialect (the tenant placeholder
63
+ * path, the sensitive guardrail when no dialect is supplied). Recognizes the union of
64
+ * quoting forms — `'…'`, `E'…'`, `$tag$…$tag$`, `"…"`, `` `…` ``, `[…]` — with the
65
+ * escape rules the owning engine uses, and standard `--` / `/* *\/` comments.
66
+ */
67
+ export const GENERIC_LEXER = {
68
+ id: "generic",
69
+ backslashEscapes: false,
70
+ doubleQuote: "identifier",
71
+ backtickIdentifiers: true,
72
+ bracketIdentifiers: "doubled",
73
+ dollarQuotes: true,
74
+ escapeStrings: true,
75
+ hashComments: false,
76
+ dashCommentNeedsSpace: false,
77
+ nestedBlockComments: false,
78
+ executableComments: false,
79
+ atVariables: true,
80
+ hashIdentifiers: false,
81
+ };
82
+ /** Every engine-specific profile. Used when the dialect is unknown and each reading must be safe. */
83
+ export const ENGINE_LEXER_PROFILES = [
84
+ POSTGRES_LEXER,
85
+ MYSQL_LEXER,
86
+ SQLSERVER_LEXER,
87
+ SQLITE_LEXER,
88
+ ];
89
+ /**
90
+ * The lexer profile for a dialect, or `undefined` when the id is not a built-in engine
91
+ * family (callers should then check every profile in {@link ENGINE_LEXER_PROFILES}).
92
+ *
93
+ * `backslashEscapes` on the spec is honored: MySQL with `NO_BACKSLASH_ESCAPES` sets it
94
+ * to `false`; Postgres with `standard_conforming_strings = off` sets it to `true`.
95
+ * An unset value on a MySQL-family spec means the server default (escapes on).
96
+ */
97
+ export function lexerProfileFor(dialect) {
98
+ switch (dialect.id) {
99
+ case "postgres":
100
+ case "cockroachdb":
101
+ return dialect.backslashEscapes === true
102
+ ? { ...POSTGRES_LEXER, backslashEscapes: true }
103
+ : POSTGRES_LEXER;
104
+ case "mysql":
105
+ case "mariadb":
106
+ return dialect.backslashEscapes === false
107
+ ? { ...MYSQL_LEXER, backslashEscapes: false }
108
+ : MYSQL_LEXER;
109
+ case "sqlserver":
110
+ return SQLSERVER_LEXER;
111
+ case "sqlite":
112
+ return SQLITE_LEXER;
113
+ default:
114
+ return undefined;
115
+ }
116
+ }
117
+ const WORD_START = /[A-Za-z_\u0080-￿]/;
118
+ const WORD_CHAR = /[A-Za-z0-9_$\u0080-￿]/;
119
+ const DIGIT = /[0-9]/;
120
+ const HEX = /[0-9A-Fa-f]/;
121
+ const DOLLAR_TAG = /^\$([A-Za-z_\u0080-￿][A-Za-z0-9_\u0080-￿]*)?\$/;
122
+ /**
123
+ * Whether the `--` at `i` starts a line comment. It always does, except on MySQL/MariaDB
124
+ * (`needsSpace`), where it must be followed by whitespace, a control character, or the end
125
+ * of the statement: there `--1` is two minus signs and a number.
126
+ */
127
+ export function startsDashComment(sql, i, needsSpace) {
128
+ if (sql[i] !== "-" || sql[i + 1] !== "-")
129
+ return false;
130
+ const after = sql[i + 2];
131
+ return !needsSpace || after === undefined || /[\s\x00-\x1f]/.test(after);
132
+ }
133
+ /** Split `sql` into tokens under `profile`. Whitespace is dropped; comments are kept. */
134
+ export function lexSql(sql, profile) {
135
+ const tokens = [];
136
+ const n = sql.length;
137
+ let i = 0;
138
+ /** Index in `tokens` of the open MySQL `/*! … *\/` executable-comment opener, or -1. */
139
+ let executableOpener = -1;
140
+ const push = (kind, start, end, extra) => {
141
+ const text = sql.slice(start, end);
142
+ const value = extra?.value ?? text;
143
+ const token = { kind, text, value, lower: value.toLowerCase(), start, end };
144
+ if (extra?.quote !== undefined)
145
+ token.quote = extra.quote;
146
+ if (extra?.unterminated)
147
+ token.unterminated = true;
148
+ tokens.push(token);
149
+ };
150
+ /**
151
+ * Scan a delimited run starting after the opening delimiter at `from`. `close` doubled
152
+ * is always an escaped delimiter; `backslash` additionally makes `\x` an escape.
153
+ */
154
+ const scanDelimited = (from, close, backslash) => {
155
+ let j = from;
156
+ let value = "";
157
+ while (j < n) {
158
+ const c = sql[j];
159
+ if (backslash && c === "\\") {
160
+ value += sql.slice(j, j + 2);
161
+ j += 2;
162
+ continue;
163
+ }
164
+ if (c === close) {
165
+ if (sql[j + 1] === close) {
166
+ value += close;
167
+ j += 2;
168
+ continue;
169
+ }
170
+ return { end: j + 1, value, terminated: true };
171
+ }
172
+ value += c;
173
+ j++;
174
+ }
175
+ return { end: n, value, terminated: false };
176
+ };
177
+ const lexString = (start, quoteAt, backslash, kind) => {
178
+ const q = sql[quoteAt];
179
+ const r = scanDelimited(quoteAt + 1, q, backslash);
180
+ push(kind, start, Math.min(r.end, n), {
181
+ quote: q,
182
+ ...(kind === "quoted_identifier" ? { value: r.value } : {}),
183
+ unterminated: !r.terminated,
184
+ });
185
+ i = r.end;
186
+ };
187
+ while (i < n) {
188
+ const ch = sql[i];
189
+ const next = sql[i + 1];
190
+ if (/\s/.test(ch)) {
191
+ i++;
192
+ continue;
193
+ }
194
+ // ---- comments -------------------------------------------------------
195
+ if (ch === "-" && next === "-") {
196
+ if (startsDashComment(sql, i, profile.dashCommentNeedsSpace)) {
197
+ let j = i + 2;
198
+ while (j < n && sql[j] !== "\n" && sql[j] !== "\r")
199
+ j++;
200
+ push("comment", i, j);
201
+ i = j;
202
+ continue;
203
+ }
204
+ }
205
+ if (ch === "#" && profile.hashComments) {
206
+ let j = i + 1;
207
+ while (j < n && sql[j] !== "\n" && sql[j] !== "\r")
208
+ j++;
209
+ push("comment", i, j);
210
+ i = j;
211
+ continue;
212
+ }
213
+ if (ch === "*" && next === "/" && executableOpener !== -1) {
214
+ push("comment", i, i + 2);
215
+ executableOpener = -1;
216
+ i += 2;
217
+ continue;
218
+ }
219
+ if (ch === "/" && next === "*") {
220
+ if (profile.executableComments && executableOpener === -1) {
221
+ const exec = /^\/\*M?!\d*/.exec(sql.slice(i));
222
+ if (exec) {
223
+ executableOpener = tokens.length;
224
+ push("comment", i, i + exec[0].length);
225
+ i += exec[0].length;
226
+ continue;
227
+ }
228
+ }
229
+ let j = i + 2;
230
+ let depth = 1;
231
+ while (j < n) {
232
+ if (sql[j] === "*" && sql[j + 1] === "/") {
233
+ depth--;
234
+ j += 2;
235
+ if (depth === 0)
236
+ break;
237
+ continue;
238
+ }
239
+ if (profile.nestedBlockComments && sql[j] === "/" && sql[j + 1] === "*") {
240
+ depth++;
241
+ j += 2;
242
+ continue;
243
+ }
244
+ j++;
245
+ }
246
+ push("comment", i, Math.min(j, n), { unterminated: depth > 0 });
247
+ i = j;
248
+ continue;
249
+ }
250
+ // ---- strings and quoted identifiers ---------------------------------
251
+ if (ch === "'") {
252
+ lexString(i, i, profile.backslashEscapes, "string");
253
+ continue;
254
+ }
255
+ if (ch === '"') {
256
+ if (profile.doubleQuote === "identifier")
257
+ lexString(i, i, false, "quoted_identifier");
258
+ else
259
+ lexString(i, i, profile.backslashEscapes, "string");
260
+ continue;
261
+ }
262
+ if (ch === "`" && profile.backtickIdentifiers) {
263
+ lexString(i, i, false, "quoted_identifier");
264
+ continue;
265
+ }
266
+ if (ch === "[" && profile.bracketIdentifiers) {
267
+ let j = i + 1;
268
+ let value = "";
269
+ let terminated = false;
270
+ while (j < n) {
271
+ if (sql[j] === "]") {
272
+ if (profile.bracketIdentifiers === "doubled" && sql[j + 1] === "]") {
273
+ value += "]";
274
+ j += 2;
275
+ continue;
276
+ }
277
+ j++;
278
+ terminated = true;
279
+ break;
280
+ }
281
+ value += sql[j];
282
+ j++;
283
+ }
284
+ push("quoted_identifier", i, j, { value, quote: "[", unterminated: !terminated });
285
+ i = j;
286
+ continue;
287
+ }
288
+ if (ch === "$") {
289
+ if (profile.dollarQuotes) {
290
+ const tag = DOLLAR_TAG.exec(sql.slice(i));
291
+ if (tag) {
292
+ const opener = tag[0];
293
+ const closeAt = sql.indexOf(opener, i + opener.length);
294
+ const end = closeAt === -1 ? n : closeAt + opener.length;
295
+ push("string", i, end, { quote: opener, unterminated: closeAt === -1 });
296
+ i = end;
297
+ continue;
298
+ }
299
+ }
300
+ if (next !== undefined && (DIGIT.test(next) || (!profile.dollarQuotes && WORD_START.test(next)))) {
301
+ let j = i + 1;
302
+ while (j < n && WORD_CHAR.test(sql[j]) && sql[j] !== "$")
303
+ j++;
304
+ push("parameter", i, j);
305
+ i = j;
306
+ continue;
307
+ }
308
+ }
309
+ // ---- words (and prefixed string literals) ---------------------------
310
+ if (WORD_START.test(ch) || (ch === "#" && profile.hashIdentifiers && next !== undefined && (next === "#" || WORD_START.test(next)))) {
311
+ let j = i + 1;
312
+ while (j < n && (WORD_CHAR.test(sql[j]) || (profile.hashIdentifiers && sql[j] === "#")))
313
+ j++;
314
+ const word = sql.slice(i, j);
315
+ if (sql[j] === "'" && j - i === 1) {
316
+ const prefix = word.toLowerCase();
317
+ if (prefix === "e" && profile.escapeStrings) {
318
+ lexString(i, j, true, "string");
319
+ continue;
320
+ }
321
+ if (prefix === "n" || prefix === "x" || prefix === "b") {
322
+ lexString(i, j, profile.backslashEscapes, "string");
323
+ continue;
324
+ }
325
+ }
326
+ push("word", i, j);
327
+ i = j;
328
+ continue;
329
+ }
330
+ // ---- numbers --------------------------------------------------------
331
+ if (DIGIT.test(ch) || (ch === "." && next !== undefined && DIGIT.test(next))) {
332
+ let j = i;
333
+ if (ch === "0" && (next === "x" || next === "X") && HEX.test(sql[i + 2] ?? "")) {
334
+ j = i + 2;
335
+ while (j < n && HEX.test(sql[j]))
336
+ j++;
337
+ }
338
+ else {
339
+ while (j < n && DIGIT.test(sql[j]))
340
+ j++;
341
+ if (sql[j] === "." && sql[j + 1] !== ".") {
342
+ j++;
343
+ while (j < n && DIGIT.test(sql[j]))
344
+ j++;
345
+ }
346
+ if ((sql[j] === "e" || sql[j] === "E") && /^[eE][+-]?[0-9]/.test(sql.slice(j))) {
347
+ j += sql[j + 1] === "+" || sql[j + 1] === "-" ? 2 : 1;
348
+ while (j < n && DIGIT.test(sql[j]))
349
+ j++;
350
+ }
351
+ }
352
+ // Trailing letters (`1from`, MySQL `1abc`) are lexed as a separate word so a keyword
353
+ // glued to a number is still seen.
354
+ push("number", i, j);
355
+ i = j;
356
+ continue;
357
+ }
358
+ // ---- parameters and punctuation -------------------------------------
359
+ if (ch === ":" && next === ":") {
360
+ push("punct", i, i + 2);
361
+ i += 2;
362
+ continue;
363
+ }
364
+ if (ch === ":" && next !== undefined && WORD_START.test(next)) {
365
+ let j = i + 1;
366
+ while (j < n && WORD_CHAR.test(sql[j]))
367
+ j++;
368
+ push("parameter", i, j);
369
+ i = j;
370
+ continue;
371
+ }
372
+ if (ch === "@" && profile.atVariables) {
373
+ let j = i + 1;
374
+ if (sql[j] === "@")
375
+ j++;
376
+ if (j < n && WORD_START.test(sql[j])) {
377
+ while (j < n && WORD_CHAR.test(sql[j]))
378
+ j++;
379
+ push("parameter", i, j);
380
+ i = j;
381
+ continue;
382
+ }
383
+ }
384
+ push("punct", i, i + 1);
385
+ i++;
386
+ }
387
+ // An executable comment whose `*\/` never came: its body was lexed as code, but the
388
+ // comment itself runs off the end, so flag the opener like any other unclosed comment.
389
+ if (executableOpener !== -1)
390
+ tokens[executableOpener].unterminated = true;
391
+ return tokens;
392
+ }
393
+ /** True when any token ran off the end of the input. */
394
+ export function hasUnterminatedToken(tokens) {
395
+ return tokens.some((t) => t.unterminated === true);
396
+ }
397
+ //# sourceMappingURL=lexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.js","sourceRoot":"","sources":["../../src/sql/lexer.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { type SensitiveReference, type SensitiveScopeReport } from "../errors.js";
2
2
  import type { AnyNormalizedSchema } from "../schema/types.js";
3
+ import type { DialectSpec } from "./dialect-spec.js";
3
4
  export type SensitiveGuardrailMode = "warn" | "strict";
4
5
  export type ValidateSensitiveReferencesOptions = {
5
6
  /**
@@ -8,6 +9,13 @@ export type ValidateSensitiveReferencesOptions = {
8
9
  * proven clean (references found, or scope could not be resolved).
9
10
  */
10
11
  mode?: SensitiveGuardrailMode;
12
+ /**
13
+ * The engine the SQL targets, so strings, quoted identifiers, and comments are lexed
14
+ * the way that engine reads them (e.g. MySQL backslash escapes, Postgres `E'…'`).
15
+ * When omitted, references are collected under every built-in engine's reading, which
16
+ * is conservative and can over-report in rare cases.
17
+ */
18
+ dialect?: Pick<DialectSpec, "id" | "backslashEscapes">;
11
19
  };
12
20
  export type SensitiveGuardrailResult = {
13
21
  /** True only when nothing sensitive was referenced **and** table scope was fully resolved. */
@@ -31,10 +39,17 @@ export type SensitiveGuardrailResult = {
31
39
  * are resolved first. When scope cannot be resolved (no resolvable table source, or a
32
40
  * qualifier that binds to nothing known), the check fails conservatively — it widens
33
41
  * matching and reports why in {@link SensitiveGuardrailResult.unresolvedScope} — rather
34
- * than passing silently.
42
+ * than passing silently. A string, quoted identifier, or comment that never closes is
43
+ * reported the same way (`UNTERMINATED_TOKEN`).
44
+ *
45
+ * `SELECT *`, `alias.*`, and whole-row references such as `row_to_json(alias)` count as
46
+ * referencing every sensitive column of the table they reach. They expand per query
47
+ * block: a bare `*` covers its own `SELECT`'s FROM/JOIN tables, and an alias resolves in
48
+ * its own block first, then in enclosing blocks. When the block structure cannot be
49
+ * read with confidence, they expand against every table in the statement.
35
50
  *
36
- * Heuristic, not a SQL parser. It is a review/enforcement aid, not a substitute for
37
- * database-side column privileges.
51
+ * Heuristic, not a SQL parser, and not a security boundary. It is defense in depth for
52
+ * review and enforcement; database-side column privileges are the real control.
38
53
  */
39
54
  export declare function validateSensitiveReferences(sql: string, schema: AnyNormalizedSchema, options?: ValidateSensitiveReferencesOptions): SensitiveGuardrailResult;
40
55
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sensitive-guardrail.d.ts","sourceRoot":"","sources":["../../src/sql/sensitive-guardrail.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EAGvB,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvD,MAAM,MAAM,kCAAkC,GAAG;IAC/C;;;;OAIG;IACH,IAAI,CAAC,EAAE,sBAAsB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,8FAA8F;IAC9F,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,8FAA8F;IAC9F,eAAe,CAAC,EAAE,oBAAoB,CAAC;CACxC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,mBAAmB,EAC3B,OAAO,CAAC,EAAE,kCAAkC,GAC3C,wBAAwB,CAiB1B;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAElF;AAED,wGAAwG;AACxG,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAGxE"}
1
+ {"version":3,"file":"sensitive-guardrail.d.ts","sourceRoot":"","sources":["../../src/sql/sensitive-guardrail.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EAGvB,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAUrD,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvD,MAAM,MAAM,kCAAkC,GAAG;IAC/C;;;;OAIG;IACH,IAAI,CAAC,EAAE,sBAAsB,CAAC;IAC9B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,kBAAkB,CAAC,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,8FAA8F;IAC9F,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,8FAA8F;IAC9F,eAAe,CAAC,EAAE,oBAAoB,CAAC;CACxC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,mBAAmB,EAC3B,OAAO,CAAC,EAAE,kCAAkC,GAC3C,wBAAwB,CAiB1B;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAElF;AAED,wGAAwG;AACxG,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAGxE"}