@spinajs/orm-sql 2.0.480 → 2.0.482

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.
@@ -1,5 +1,27 @@
1
- import { LimitBuilder, DropTableQueryBuilder, AlterColumnQueryBuilder, TableCloneQueryCompiler, OnDuplicateQueryBuilder, IJoinCompiler, DeleteQueryBuilder, IColumnsBuilder, IColumnsCompiler, ICompilerOutput, LimitQueryCompiler, IGroupByCompiler, InsertQueryBuilder, IWhereBuilder, IWhereCompiler, OrderByBuilder, QueryBuilder, SelectQueryBuilder, UpdateQueryBuilder, SelectQueryCompiler, TableQueryCompiler, TableQueryBuilder, ColumnQueryBuilder, ColumnQueryCompiler, IQueryBuilder, OrderByQueryCompiler, OnDuplicateQueryCompiler, IJoinBuilder, IndexQueryCompiler, IndexQueryBuilder, IRecursiveCompiler, IWithRecursiveBuilder, ForeignKeyBuilder, ForeignKeyQueryCompiler, IGroupByBuilder, AlterTableQueryBuilder, CloneTableQueryBuilder, AlterTableQueryCompiler, TableAliasCompiler, DropTableCompiler, DropEventQueryBuilder, TableHistoryQueryCompiler, EventQueryBuilder, EventIntervalDesc, IHavingCompiler, RawSchemaQueryCompiler, RawSchemaQueryBuilder, DropViewQueryBuilder, DropViewCompiler } from '@spinajs/orm';
1
+ import { LimitBuilder, DropTableQueryBuilder, AlterColumnQueryBuilder, TableCloneQueryCompiler, OnDuplicateQueryBuilder, IJoinCompiler, DeleteQueryBuilder, IColumnsBuilder, IColumnsCompiler, ICompilerOutput, LimitQueryCompiler, IGroupByCompiler, InsertQueryBuilder, IWhereBuilder, IWhereCompiler, OrderByBuilder, QueryBuilder, SelectQueryBuilder, UpdateQueryBuilder, SelectQueryCompiler, TableQueryCompiler, TableQueryBuilder, ColumnQueryBuilder, ColumnQueryCompiler, IQueryBuilder, OrderByQueryCompiler, OnDuplicateQueryCompiler, IJoinBuilder, IndexQueryCompiler, IndexQueryBuilder, IRecursiveCompiler, IWithRecursiveBuilder, ForeignKeyBuilder, ForeignKeyQueryCompiler, IGroupByBuilder, AlterTableQueryBuilder, CloneTableQueryBuilder, AlterTableQueryCompiler, AlterColumnQueryCompiler, TableAliasCompiler, DropTableCompiler, DropEventQueryBuilder, TableHistoryQueryCompiler, EventQueryBuilder, EventIntervalDesc, IHavingCompiler, RawSchemaQueryCompiler, RawSchemaQueryBuilder, DropViewQueryBuilder, DropViewCompiler } from '@spinajs/orm';
2
2
  import { Container, IContainer } from '@spinajs/di';
3
+ /**
4
+ * Central identifier escaping for the MySQL-flavoured dialect.
5
+ *
6
+ * Wraps a table/column/alias/schema name in backticks and escapes any embedded
7
+ * backtick by doubling it (the MySQL rule). For a normal identifier (no special
8
+ * characters) the output is byte-identical to the previous raw interpolation
9
+ * (`` `${name}` ``), so existing generated SQL is unchanged; only names that
10
+ * actually contain a backtick produce different — and now safe — output.
11
+ *
12
+ * Dialects that quote differently (e.g. `[name]` with `]`-doubling) override
13
+ * this by shadowing the relevant compiler/statement, the same way
14
+ * {@link SqlTableAliasCompiler} is already overridden per driver.
15
+ */
16
+ export declare function escapeIdentifier(name: string): string;
17
+ /**
18
+ * Escapes a DDL string *literal* (SET/ENUM member, COMMENT, CHARACTER SET,
19
+ * COLLATE, string DEFAULT). These are single-quoted string literals, NOT
20
+ * identifiers, so the correct escaping is doubling embedded single quotes.
21
+ * Returns the value WITHOUT the surrounding quotes so callers keep their exact
22
+ * quoting; for a value with no quote the output is byte-identical.
23
+ */
24
+ export declare function escapeStringLiteral(value: string): string;
3
25
  export declare class SqlTableAliasCompiler implements TableAliasCompiler {
4
26
  compile(builder: IQueryBuilder, tbl?: string): string;
5
27
  }
@@ -112,6 +134,18 @@ export declare class SqlInsertQueryCompiler extends SqlQueryCompiler<InsertQuery
112
134
  expression: string;
113
135
  };
114
136
  protected upsort(): ICompilerOutput;
137
+ /**
138
+ * Indices of the columns that take part in this INSERT.
139
+ *
140
+ * An auto increment primary key is omitted only when NO row supplies a value
141
+ * for it. If at least one row supplies one the column stays, and the rows
142
+ * that don't emit NULL so the engine assigns the value.
143
+ *
144
+ * Both {@link columns} and {@link values} MUST derive their shape from this
145
+ * single decision - deciding per-row in one place and per-batch in the other
146
+ * produced value tuples whose arity did not match the column list.
147
+ */
148
+ protected keptColumnIndices(): number[];
115
149
  protected values(): {
116
150
  bindings: any[];
117
151
  data: string;
@@ -217,8 +251,38 @@ export declare class SqlColumnQueryCompiler implements ColumnQueryCompiler {
217
251
  compile(): ICompilerOutput;
218
252
  protected _defaultCompiler(): string;
219
253
  }
220
- export declare class SqlAlterColumnQueryCompiler extends SqlColumnQueryCompiler {
221
- constructor(builder: AlterColumnQueryBuilder);
254
+ export interface SqlAlterColumnQueryCompiler {
255
+ }
256
+ export declare class SqlAlterColumnQueryCompiler extends AlterColumnQueryCompiler {
257
+ protected container: Container;
258
+ protected builder: AlterColumnQueryBuilder;
259
+ constructor(container: Container, builder: AlterColumnQueryBuilder);
260
+ /**
261
+ * Renders the column body using the DRIVER's own column compiler, resolved
262
+ * from the container (late binding) - exactly like the CREATE TABLE path does.
263
+ * Previously this was `super.compile()`, which statically bound every driver
264
+ * to orm-sql's MySQL dialect.
265
+ */
266
+ protected _columnDefinition(): ICompilerOutput;
267
+ /**
268
+ * Whether the expression produced by `compile()` is already a complete, standalone
269
+ * statement. When true, SqlAlterTableQueryCompiler emits it verbatim instead of
270
+ * prefixing it with `ALTER TABLE <table> `.
271
+ *
272
+ * Needed by dialects whose alteration is not expressible as a suffix of ALTER TABLE,
273
+ * eg. MSSQL's `EXEC sp_rename '[t].[old]', 'new', 'COLUMN'`.
274
+ *
275
+ * It is read AFTER `compile()`, so a subclass may decide per `builder.AlterType`.
276
+ * Defaults to false - MySQL (this class) always emits a suffix.
277
+ */
278
+ get IsStandaloneStatement(): boolean;
279
+ /**
280
+ * Dialect hooks. Returning `null` means "emit no statement at all" - the
281
+ * parent AlterTableQueryCompiler filters such columns out.
282
+ */
283
+ protected _add(definition: string): string | null;
284
+ protected _modify(definition: string): string | null;
285
+ protected _rename(): string | null;
222
286
  compile(): ICompilerOutput;
223
287
  }
224
288
  export declare class SqlEventQueryCompiler extends SqlQueryCompiler<EventQueryBuilder> {
@@ -1 +1 @@
1
- {"version":3,"file":"compilers.d.ts","sourceRoot":"","sources":["../../src/compilers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compilers.d.ts","sourceRoot":"","sources":["../../src/compilers.ts"],"names":[],"mappings":"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"}
@@ -12,19 +12,45 @@ var __metadata = (this && this.__metadata) || function (k, v) {
12
12
  /* eslint-disable @typescript-eslint/no-empty-interface */
13
13
  /* eslint-disable prettier/prettier */
14
14
  import { InvalidOperation, InvalidArgument } from '@spinajs/exceptions';
15
- import { LimitBuilder, DropTableQueryBuilder, AlterColumnQueryBuilder, TableCloneQueryCompiler, OnDuplicateQueryBuilder, DeleteQueryBuilder, LimitQueryCompiler, InsertQueryBuilder, OrderByBuilder, SelectQueryBuilder, UpdateQueryBuilder, SelectQueryCompiler, TableQueryCompiler, TableQueryBuilder, ColumnQueryBuilder, ColumnQueryCompiler, RawQuery, OrderByQueryCompiler, OnDuplicateQueryCompiler, IndexQueryCompiler, IndexQueryBuilder, ForeignKeyBuilder, ForeignKeyQueryCompiler, AlterTableQueryBuilder, CloneTableQueryBuilder, AlterTableQueryCompiler, ColumnAlterationType, AlterColumnQueryCompiler, TableAliasCompiler, DropTableCompiler, DropEventQueryBuilder, TableHistoryQueryCompiler, EventQueryBuilder, LazyQueryStatement, RawSchemaQueryCompiler, RawSchemaQueryBuilder, DropViewQueryBuilder, DropViewCompiler } from '@spinajs/orm';
15
+ import { LimitBuilder, DropTableQueryBuilder, AlterColumnQueryBuilder, TableCloneQueryCompiler, OnDuplicateQueryBuilder, DeleteQueryBuilder, LimitQueryCompiler, InsertQueryBuilder, OrderByBuilder, SelectQueryBuilder, UpdateQueryBuilder, SelectQueryCompiler, TableQueryCompiler, TableQueryBuilder, ColumnQueryBuilder, ColumnQueryCompiler, RawQuery, OrderByQueryCompiler, OnDuplicateQueryCompiler, IndexQueryCompiler, IndexQueryBuilder, ForeignKeyBuilder, ForeignKeyQueryCompiler, AlterTableQueryBuilder, CloneTableQueryBuilder, AlterTableQueryCompiler, ColumnAlterationType, AlterColumnQueryCompiler, TableAliasCompiler, DropTableCompiler, DropEventQueryBuilder, TableHistoryQueryCompiler, EventQueryBuilder, LazyQueryStatement, WhereBoolean, RawSchemaQueryCompiler, RawSchemaQueryBuilder, DropViewQueryBuilder, DropViewCompiler } from '@spinajs/orm';
16
16
  import { use } from 'typescript-mix';
17
17
  import { NewInstance, Inject, Container } from '@spinajs/di';
18
18
  import _ from 'lodash';
19
+ /**
20
+ * Central identifier escaping for the MySQL-flavoured dialect.
21
+ *
22
+ * Wraps a table/column/alias/schema name in backticks and escapes any embedded
23
+ * backtick by doubling it (the MySQL rule). For a normal identifier (no special
24
+ * characters) the output is byte-identical to the previous raw interpolation
25
+ * (`` `${name}` ``), so existing generated SQL is unchanged; only names that
26
+ * actually contain a backtick produce different — and now safe — output.
27
+ *
28
+ * Dialects that quote differently (e.g. `[name]` with `]`-doubling) override
29
+ * this by shadowing the relevant compiler/statement, the same way
30
+ * {@link SqlTableAliasCompiler} is already overridden per driver.
31
+ */
32
+ export function escapeIdentifier(name) {
33
+ return '`' + String(name).replace(/`/g, '``') + '`';
34
+ }
35
+ /**
36
+ * Escapes a DDL string *literal* (SET/ENUM member, COMMENT, CHARACTER SET,
37
+ * COLLATE, string DEFAULT). These are single-quoted string literals, NOT
38
+ * identifiers, so the correct escaping is doubling embedded single quotes.
39
+ * Returns the value WITHOUT the surrounding quotes so callers keep their exact
40
+ * quoting; for a value with no quote the output is byte-identical.
41
+ */
42
+ export function escapeStringLiteral(value) {
43
+ return String(value).replace(/'/g, "''");
44
+ }
19
45
  let SqlTableAliasCompiler = class SqlTableAliasCompiler {
20
46
  compile(builder, tbl) {
21
47
  let table = '';
22
48
  if (builder.Database) {
23
- table += `\`${builder.Database}\`.`;
49
+ table += `${escapeIdentifier(builder.Database)}.`;
24
50
  }
25
- table += `\`${tbl ? tbl : builder.Table}\``;
51
+ table += escapeIdentifier(tbl ? tbl : builder.Table);
26
52
  if (builder.TableAlias) {
27
- table += ` as \`${builder.TableAlias}\``;
53
+ table += ` as ${escapeIdentifier(builder.TableAlias)}`;
28
54
  }
29
55
  return table;
30
56
  }
@@ -38,7 +64,7 @@ let SqlQueryCompiler = class SqlQueryCompiler extends SelectQueryCompiler {
38
64
  super();
39
65
  this._builder = _builder;
40
66
  this._container = _container;
41
- if (_builder === null && _builder === undefined) {
67
+ if (_builder === null || _builder === undefined) {
42
68
  throw new InvalidArgument('builder cannot be null or undefined');
43
69
  }
44
70
  }
@@ -66,11 +92,11 @@ let SqlOrderByQueryCompiler = class SqlOrderByQueryCompiler extends OrderByQuery
66
92
  this._builder = builder;
67
93
  }
68
94
  compile() {
69
- const sort = this._builder.getSort();
95
+ const sorts = this._builder.getSorts();
70
96
  let stmt = '';
71
97
  const bindings = [];
72
- if (sort) {
73
- stmt = ` ORDER BY \`${sort.column}\` ${sort.order}`;
98
+ if (sorts.length > 0) {
99
+ stmt = ` ORDER BY ${sorts.map((s) => `${escapeIdentifier(s.column)} ${s.order}`).join(', ')}`;
74
100
  }
75
101
  return {
76
102
  bindings,
@@ -111,7 +137,7 @@ let SqlForeignKeyQueryCompiler = class SqlForeignKeyQueryCompiler {
111
137
  }
112
138
  }
113
139
  compile() {
114
- const exprr = `FOREIGN KEY (${this._builder.ForeignKeyField}) REFERENCES ${this._builder.Table}(${this._builder.PrimaryKey}) ON DELETE ${this._builder.OnDeleteAction} ON UPDATE ${this._builder.OnUpdateAction}`;
140
+ const exprr = `FOREIGN KEY (${escapeIdentifier(this._builder.ForeignKeyField)}) REFERENCES ${escapeIdentifier(this._builder.Table)}(${escapeIdentifier(this._builder.PrimaryKey)}) ON DELETE ${this._builder.OnDeleteAction} ON UPDATE ${this._builder.OnUpdateAction}`;
115
141
  return {
116
142
  bindings: [],
117
143
  expression: exprr,
@@ -194,23 +220,24 @@ SqlColumnsCompiler = __decorate([
194
220
  export { SqlColumnsCompiler };
195
221
  let SqlWhereCompiler = class SqlWhereCompiler {
196
222
  where(builder) {
197
- const where = [];
198
223
  const bindings = [];
199
- const lazyBindings = builder.Statements.filter((x) => x instanceof LazyQueryStatement).map((x) => x.build());
200
- builder.Statements.filter((x) => !x.IsAggregate).filter(x => !(x instanceof LazyQueryStatement))
201
- .map((x) => {
202
- return x.build();
203
- })
204
- .concat(lazyBindings)
205
- .forEach((r) => {
206
- where.push(...r.Statements);
207
- if (Array.isArray(r.Bindings)) {
208
- bindings.push(...r.Bindings);
209
- }
210
- });
224
+ // Lazy statements must be built FIRST: their build() may have side effects
225
+ // that append further statements to the builder (e.g. a correlated EXISTS
226
+ // sub-query registers its correlation predicate lazily). Building them now and
227
+ // reusing the result guarantees the side effect runs exactly once, and lets the
228
+ // non-lazy pass below pick up any statements the lazy build appended. The lazy
229
+ // results are then emitted after the non-lazy ones (preserving legacy ordering).
230
+ const lazyEntries = builder.Statements.filter((x) => x instanceof LazyQueryStatement).map((stmt) => ({
231
+ boolean: stmt.Boolean,
232
+ result: stmt.build(),
233
+ }));
234
+ const nonLazyEntries = builder.Statements
235
+ .filter((x) => !x.IsAggregate)
236
+ .filter((x) => !(x instanceof LazyQueryStatement))
237
+ .map((stmt) => ({ boolean: stmt.Boolean, result: stmt.build() }));
211
238
  return {
212
239
  bindings,
213
- expression: where.join(` ${builder.Op.toUpperCase()} `),
240
+ expression: joinBuiltStatements(nonLazyEntries.concat(lazyEntries), bindings),
214
241
  };
215
242
  }
216
243
  };
@@ -218,23 +245,41 @@ SqlWhereCompiler = __decorate([
218
245
  NewInstance()
219
246
  ], SqlWhereCompiler);
220
247
  export { SqlWhereCompiler };
248
+ /**
249
+ * Joins a list of already-built where/having statements into a single SQL
250
+ * expression, prefixing every statement after the first with its OWN boolean
251
+ * connector. This yields correct mixed grouping such as
252
+ * `a AND b OR c` for `where(a).where(b).orWhere(c)`, instead of applying a single
253
+ * builder-level connector uniformly. Bindings are collected in statement order.
254
+ */
255
+ function joinBuiltStatements(statements, bindings) {
256
+ const parts = [];
257
+ statements.forEach(({ boolean, result }) => {
258
+ if (Array.isArray(result.Bindings)) {
259
+ bindings.push(...result.Bindings);
260
+ }
261
+ // A single statement always builds to one fragment; guard multi-fragment
262
+ // statements by joining them with AND (they carry no per-fragment connector).
263
+ const fragment = result.Statements.join(' AND ');
264
+ if (fragment === '') {
265
+ return;
266
+ }
267
+ if (parts.length === 0) {
268
+ parts.push(fragment);
269
+ }
270
+ else {
271
+ parts.push(`${(boolean ?? WhereBoolean.AND).toUpperCase()} ${fragment}`);
272
+ }
273
+ });
274
+ return parts.join(' ');
275
+ }
221
276
  let SqlHavingCompiler = class SqlHavingCompiler {
222
277
  having(builder) {
223
- const where = [];
224
278
  const bindings = [];
225
- builder.Statements.filter((x) => x.IsAggregate)
226
- .map((x) => {
227
- return x.build();
228
- })
229
- .forEach((r) => {
230
- where.push(...r.Statements);
231
- if (Array.isArray(r.Bindings)) {
232
- bindings.push(...r.Bindings);
233
- }
234
- });
279
+ const aggregates = builder.Statements.filter((x) => x.IsAggregate).map((stmt) => ({ boolean: stmt.Boolean, result: stmt.build() }));
235
280
  return {
236
281
  bindings,
237
- expression: where.join(` ${builder.Op.toUpperCase()} `),
282
+ expression: joinBuiltStatements(aggregates, bindings),
238
283
  };
239
284
  }
240
285
  };
@@ -342,7 +387,7 @@ let SqlUpdateQueryCompiler = class SqlUpdateQueryCompiler extends SqlQueryCompil
342
387
  const exprr = [];
343
388
  for (const prop of Object.keys(this._builder.Value)) {
344
389
  const v = this._builder.Value[`${prop}`];
345
- exprr.push(`\`${prop}\` = ?`);
390
+ exprr.push(`${escapeIdentifier(prop)} = ?`);
346
391
  bindings = bindings.concat(this.tryConvertValue(v));
347
392
  }
348
393
  return {
@@ -409,22 +454,22 @@ let SqlOnDuplicateQueryCompiler = class SqlOnDuplicateQueryCompiler {
409
454
  .getColumnsToUpdate()
410
455
  .map((c) => {
411
456
  if (_.isString(c)) {
412
- return `\`${c}\` = ?`;
457
+ // Reference the row being inserted via VALUES(col) instead of
458
+ // re-binding one specific row's value. Binding `parent.Values[0]`
459
+ // applied the FIRST row's values to every conflicting row in a
460
+ // multi row upsert.
461
+ return `${escapeIdentifier(c)} = VALUES(${escapeIdentifier(c)})`;
413
462
  }
414
463
  else {
415
464
  return c.Query;
416
465
  }
417
466
  })
418
467
  .join(',');
419
- const parent = this._builder.getParent();
420
- const valueMap = parent.getColumns().map((c) => c.Column);
421
- const bindings = this._builder.getColumnsToUpdate().map((c) => {
422
- if (_.isString(c)) {
423
- return parent.Values[0][valueMap.indexOf(c)];
424
- }
425
- else {
426
- return c.Bindings;
427
- }
468
+ // Only RawQuery update columns contribute bindings - VALUES(col) needs
469
+ // none. flatMap keeps raw bindings flat; returning the array itself
470
+ // nested them and shifted every following placeholder.
471
+ const bindings = _.flatMap(this._builder.getColumnsToUpdate(), (c) => {
472
+ return _.isString(c) ? [] : c.Bindings ?? [];
428
473
  });
429
474
  return {
430
475
  bindings,
@@ -445,7 +490,7 @@ let SqlIndexQueryCompiler = class SqlIndexQueryCompiler extends IndexQueryCompil
445
490
  compile() {
446
491
  return {
447
492
  bindings: [],
448
- expression: `CREATE ${this._builder.Unique ? 'UNIQUE ' : ''}INDEX \`${this._builder.Name}\` ON \`${this._builder.Table}\` (${this._builder.Columns.map((c) => `\`${c}\``).join(',')});`,
493
+ expression: `CREATE ${this._builder.Unique ? 'UNIQUE ' : ''}INDEX ${escapeIdentifier(this._builder.Name)} ON ${escapeIdentifier(this._builder.Table)} (${this._builder.Columns.map((c) => escapeIdentifier(c)).join(',')});`,
449
494
  };
450
495
  }
451
496
  };
@@ -477,31 +522,54 @@ let SqlInsertQueryCompiler = class SqlInsertQueryCompiler extends SqlQueryCompil
477
522
  expression: '',
478
523
  };
479
524
  }
525
+ /**
526
+ * Indices of the columns that take part in this INSERT.
527
+ *
528
+ * An auto increment primary key is omitted only when NO row supplies a value
529
+ * for it. If at least one row supplies one the column stays, and the rows
530
+ * that don't emit NULL so the engine assigns the value.
531
+ *
532
+ * Both {@link columns} and {@link values} MUST derive their shape from this
533
+ * single decision - deciding per-row in one place and per-batch in the other
534
+ * produced value tuples whose arity did not match the column list.
535
+ */
536
+ keptColumnIndices() {
537
+ return this._builder
538
+ .getColumns()
539
+ .map((c, i) => ({ c, i }))
540
+ .filter(({ c, i }) => {
541
+ const descriptor = c.Descriptor;
542
+ if (descriptor && descriptor.AutoIncrement && descriptor.PrimaryKey) {
543
+ return this._builder.Values.some((x) => x[i] !== undefined && x[i] !== null);
544
+ }
545
+ return true;
546
+ })
547
+ .map(({ i }) => i);
548
+ }
480
549
  values() {
481
550
  if (this._builder.Values.length === 0) {
482
551
  throw new InvalidArgument('values count invalid');
483
552
  }
553
+ const kept = this.keptColumnIndices();
484
554
  const bindings = [];
485
555
  let data = 'VALUES ';
486
556
  data += this._builder.Values.map((val) => {
487
- const toInsert = val
488
- .filter((v, i) => {
557
+ const toInsert = kept.map((i) => {
558
+ // eslint-disable-next-line security/detect-object-injection
559
+ const v = val[i];
489
560
  // eslint-disable-next-line security/detect-object-injection
490
561
  const descriptor = this._builder.getColumns()[i].Descriptor;
491
562
  if (descriptor) {
492
563
  if (!descriptor.Nullable && (v === null || v === undefined) && !descriptor.AutoIncrement) {
493
564
  throw new InvalidArgument(`value column ${descriptor.Name} cannot be null`);
494
565
  }
495
- if (descriptor.AutoIncrement && descriptor.PrimaryKey) {
496
- if (v !== undefined && v !== null) {
497
- return true;
498
- }
499
- return false;
566
+ // Auto increment PK this row does not supply. NULL (not DEFAULT) lets
567
+ // the engine assign it and is portable - sqlite does not accept the
568
+ // DEFAULT keyword inside a VALUES tuple.
569
+ if (descriptor.AutoIncrement && descriptor.PrimaryKey && (v === undefined || v === null)) {
570
+ return 'NULL';
500
571
  }
501
572
  }
502
- return true;
503
- })
504
- .map((v) => {
505
573
  if (v === undefined) {
506
574
  return 'DEFAULT';
507
575
  }
@@ -519,23 +587,15 @@ let SqlInsertQueryCompiler = class SqlInsertQueryCompiler extends SqlQueryCompil
519
587
  };
520
588
  }
521
589
  columns() {
522
- const columns = this._builder
523
- .getColumns()
524
- .filter((c, i) => {
525
- const descriptor = c.Descriptor;
526
- if (descriptor && descriptor.AutoIncrement && descriptor.PrimaryKey) {
527
- if (this._builder.Values.every((x) => x[i] !== undefined && x[i] !== null)) {
528
- return true;
529
- }
530
- return false;
531
- }
532
- return true;
533
- })
534
- .map((c) => {
535
- return c.Column;
590
+ const columns = this.keptColumnIndices()
591
+ .map((i) => {
592
+ // eslint-disable-next-line security/detect-object-injection
593
+ return this._builder.getColumns()[i].Column;
536
594
  })
537
595
  .map((c) => {
538
- return `\`${c instanceof RawQuery ? c.Query : c}\``;
596
+ // RawQuery columns carry raw SQL - preserve the existing (unescaped)
597
+ // backtick wrapping. String columns go through the identifier escaper.
598
+ return c instanceof RawQuery ? `\`${c.Query}\`` : escapeIdentifier(c);
539
599
  });
540
600
  if (columns.length === 0) {
541
601
  throw new InvalidArgument('invalid column count');
@@ -623,10 +683,22 @@ let SqlAlterTableQueryCompiler = class SqlAlterTableQueryCompiler extends AlterT
623
683
  }
624
684
  if (this.builder.Columns.length !== 0) {
625
685
  _outputs = _outputs.concat(this.builder.Columns.map((c) => {
626
- const compiler = this.container.resolve(AlterColumnQueryCompiler, [c]).compile();
686
+ // keep the compiler instance around - it carries the dialect's answer to
687
+ // "is my expression already a complete statement ?" (see IsStandaloneStatement)
688
+ const compiler = this.container.resolve(AlterColumnQueryCompiler, [c]);
689
+ return { compiler, output: compiler.compile() };
690
+ })
691
+ // a driver may legitimately skip an alteration by compiling it to nothing.
692
+ // emitting it anyway would yield a dangling `ALTER TABLE \`x\`` - invalid SQL.
693
+ .filter(({ output }) => (output.expression ?? '').trim().length !== 0)
694
+ .map(({ compiler, output }) => {
695
+ // some dialects cannot express an alteration as a suffix of `ALTER TABLE x`
696
+ // eg. MSSQL renames a column with `EXEC sp_rename '[t].[old]', 'new', 'COLUMN'`,
697
+ // which is a complete statement and must be emitted verbatim.
698
+ const standalone = compiler.IsStandaloneStatement === true;
627
699
  return {
628
- bindings: compiler.bindings,
629
- expression: `${_table} ${compiler.expression}`,
700
+ bindings: output.bindings,
701
+ expression: standalone ? output.expression : `${_table} ${output.expression}`,
630
702
  };
631
703
  }));
632
704
  }
@@ -663,7 +735,7 @@ let SqlTableCloneQueryCompiler = class SqlTableCloneQueryCompiler extends TableC
663
735
  // if no filter is provided, copy all the data
664
736
  expression: `SELECT * FROM ${_tblName}`,
665
737
  };
666
- const fExprr = `INSERT INTO \`${this.builder.Table}\` ${fOut.expression}`;
738
+ const fExprr = `INSERT INTO ${escapeIdentifier(this.builder.Table)} ${fOut.expression}`;
667
739
  return [
668
740
  out1,
669
741
  {
@@ -845,7 +917,7 @@ let SqlTableQueryCompiler = class SqlTableQueryCompiler extends TableQueryCompil
845
917
  }
846
918
  _primaryKeys() {
847
919
  const _keys = this.builder.Columns.filter((x) => x.PrimaryKey)
848
- .map((c) => `\`${c.Name}\``)
920
+ .map((c) => escapeIdentifier(c.Name))
849
921
  .join(',');
850
922
  if (!_.isEmpty(_keys)) {
851
923
  return `PRIMARY KEY (${_keys})`;
@@ -866,7 +938,7 @@ let SqlColumnQueryCompiler = class SqlColumnQueryCompiler {
866
938
  constructor(builder) {
867
939
  this.builder = builder;
868
940
  this._statementsMappings = {
869
- set: (builder) => `SET(${builder.Args[0].map((a) => `'${a}\'`).join(',')})`,
941
+ set: (builder) => `SET(${builder.Args[0].map((a) => `'${escapeStringLiteral(a)}'`).join(',')})`,
870
942
  string: (builder) => `VARCHAR(${builder.Args[0] ? builder.Args[0] : 255})`,
871
943
  boolean: () => `BOOLEAN`,
872
944
  float: (builder) => {
@@ -876,8 +948,8 @@ let SqlColumnQueryCompiler = class SqlColumnQueryCompiler {
876
948
  },
877
949
  double: (builder) => this._statementsMappings.float(builder),
878
950
  decimal: (builder) => this._statementsMappings.float(builder),
879
- enum: (builder) => `${builder.Type.toUpperCase()}(${builder.Args[0].map((a) => `'${a}'`).join(',')})`,
880
- binary: (builder) => `BINARY(${builder.Args[0] ?? 255}`,
951
+ enum: (builder) => `${builder.Type.toUpperCase()}(${builder.Args[0].map((a) => `'${escapeStringLiteral(a)}'`).join(',')})`,
952
+ binary: (builder) => `BINARY(${builder.Args[0] ?? 255})`,
881
953
  smallint: (builder) => builder.Type.toUpperCase(),
882
954
  tinyint: (builder) => builder.Type.toUpperCase(),
883
955
  mediumint: (builder) => builder.Type.toUpperCase(),
@@ -898,12 +970,12 @@ let SqlColumnQueryCompiler = class SqlColumnQueryCompiler {
898
970
  longblob: (builder) => builder.Type.toUpperCase(),
899
971
  // COLUMN ADDITIONA PROPS
900
972
  unsigned: () => 'UNSIGNED',
901
- charset: (builder) => `CHARACTER SET '${builder.Charset}'`,
902
- collation: (builder) => `COLLATE '${builder.Collation}'`,
973
+ charset: (builder) => `CHARACTER SET '${escapeStringLiteral(builder.Charset)}'`,
974
+ collation: (builder) => `COLLATE '${escapeStringLiteral(builder.Collation)}'`,
903
975
  notnull: () => `NOT NULL`,
904
976
  default: () => this._defaultCompiler(),
905
977
  autoincrement: () => `AUTO_INCREMENT`,
906
- comment: (builder) => `COMMENT '${builder.Comment}'`,
978
+ comment: (builder) => `COMMENT '${escapeStringLiteral(builder.Comment)}'`,
907
979
  };
908
980
  if (!builder) {
909
981
  throw new Error('column query builder cannot be null');
@@ -911,7 +983,7 @@ let SqlColumnQueryCompiler = class SqlColumnQueryCompiler {
911
983
  }
912
984
  compile() {
913
985
  const _stmt = [];
914
- _stmt.push(`\`${this.builder.Name}\``);
986
+ _stmt.push(escapeIdentifier(this.builder.Name));
915
987
  _stmt.push(this._statementsMappings[this.builder.Type](this.builder));
916
988
  if (this.builder.Unsigned) {
917
989
  _stmt.push(this._statementsMappings.unsigned());
@@ -948,7 +1020,7 @@ let SqlColumnQueryCompiler = class SqlColumnQueryCompiler {
948
1020
  return _stmt;
949
1021
  }
950
1022
  if (_.isString(this.builder.Default.Value)) {
951
- _stmt = `DEFAULT '${this.builder.Default.Value.trim()}'`;
1023
+ _stmt = `DEFAULT '${escapeStringLiteral(this.builder.Default.Value.trim())}'`;
952
1024
  }
953
1025
  else if (_.isNumber(this.builder.Default.Value)) {
954
1026
  _stmt = `DEFAULT ${this.builder.Default.Value}`;
@@ -964,38 +1036,84 @@ SqlColumnQueryCompiler = __decorate([
964
1036
  __metadata("design:paramtypes", [ColumnQueryBuilder])
965
1037
  ], SqlColumnQueryCompiler);
966
1038
  export { SqlColumnQueryCompiler };
967
- let SqlAlterColumnQueryCompiler = class SqlAlterColumnQueryCompiler extends SqlColumnQueryCompiler {
968
- constructor(builder) {
969
- super(builder);
1039
+ let SqlAlterColumnQueryCompiler = class SqlAlterColumnQueryCompiler extends AlterColumnQueryCompiler {
1040
+ constructor(container, builder) {
1041
+ super();
1042
+ this.container = container;
1043
+ this.builder = builder;
1044
+ if (!builder) {
1045
+ throw new InvalidArgument('builder cannot be null or undefined');
1046
+ }
1047
+ }
1048
+ /**
1049
+ * Renders the column body using the DRIVER's own column compiler, resolved
1050
+ * from the container (late binding) - exactly like the CREATE TABLE path does.
1051
+ * Previously this was `super.compile()`, which statically bound every driver
1052
+ * to orm-sql's MySQL dialect.
1053
+ */
1054
+ _columnDefinition() {
1055
+ return this.container.resolve(ColumnQueryCompiler, [this.builder]).compile();
1056
+ }
1057
+ /**
1058
+ * Whether the expression produced by `compile()` is already a complete, standalone
1059
+ * statement. When true, SqlAlterTableQueryCompiler emits it verbatim instead of
1060
+ * prefixing it with `ALTER TABLE <table> `.
1061
+ *
1062
+ * Needed by dialects whose alteration is not expressible as a suffix of ALTER TABLE,
1063
+ * eg. MSSQL's `EXEC sp_rename '[t].[old]', 'new', 'COLUMN'`.
1064
+ *
1065
+ * It is read AFTER `compile()`, so a subclass may decide per `builder.AlterType`.
1066
+ * Defaults to false - MySQL (this class) always emits a suffix.
1067
+ */
1068
+ get IsStandaloneStatement() {
1069
+ return false;
1070
+ }
1071
+ /**
1072
+ * Dialect hooks. Returning `null` means "emit no statement at all" - the
1073
+ * parent AlterTableQueryCompiler filters such columns out.
1074
+ */
1075
+ _add(definition) {
1076
+ // escapeIdentifier, not raw backticks: an identifier containing a backtick would
1077
+ // otherwise terminate the quote and splice arbitrary SQL into the DDL ( A3 ).
1078
+ return `ADD ${definition} ${this.builder.AfterColumn ? `AFTER ${escapeIdentifier(this.builder.AfterColumn)}` : ''}`;
1079
+ }
1080
+ _modify(definition) {
1081
+ return `MODIFY ${definition}`;
1082
+ }
1083
+ _rename() {
1084
+ return `RENAME COLUMN ${escapeIdentifier(this.builder.OldName)} TO ${escapeIdentifier(this.builder.Name)}`;
970
1085
  }
971
1086
  compile() {
972
- const builder = this.builder;
973
- if (builder.AlterType === ColumnAlterationType.Rename) {
974
- const bld = this.builder;
1087
+ // rename never renders a column body, so it must not resolve one
1088
+ if (this.builder.AlterType === ColumnAlterationType.Rename) {
975
1089
  return {
976
1090
  bindings: [],
977
- expression: `RENAME COLUMN \`${bld.OldName}\` TO \`${bld.Name}\``,
978
- };
979
- }
980
- const cDefinition = super.compile();
981
- if (builder.AlterType === ColumnAlterationType.Add) {
982
- return {
983
- bindings: cDefinition.bindings,
984
- expression: `ADD ${cDefinition.expression} ${builder.AfterColumn ? `AFTER \`${builder.AfterColumn}\`` : ''}`,
1091
+ expression: this._rename() ?? '',
985
1092
  };
986
1093
  }
987
- if (builder.AlterType === ColumnAlterationType.Modify) {
988
- return {
989
- bindings: cDefinition.bindings,
990
- expression: `MODIFY ${cDefinition.expression}`,
991
- };
1094
+ const cDefinition = this._columnDefinition();
1095
+ let expression;
1096
+ switch (this.builder.AlterType) {
1097
+ case ColumnAlterationType.Add:
1098
+ expression = this._add(cDefinition.expression);
1099
+ break;
1100
+ case ColumnAlterationType.Modify:
1101
+ expression = this._modify(cDefinition.expression);
1102
+ break;
1103
+ default:
1104
+ expression = cDefinition.expression;
1105
+ break;
992
1106
  }
993
- return cDefinition;
1107
+ return {
1108
+ bindings: cDefinition.bindings,
1109
+ expression: expression ?? '',
1110
+ };
994
1111
  }
995
1112
  };
996
1113
  SqlAlterColumnQueryCompiler = __decorate([
997
1114
  NewInstance(),
998
- __metadata("design:paramtypes", [AlterColumnQueryBuilder])
1115
+ Inject(Container),
1116
+ __metadata("design:paramtypes", [Container, AlterColumnQueryBuilder])
999
1117
  ], SqlAlterColumnQueryCompiler);
1000
1118
  export { SqlAlterColumnQueryCompiler };
1001
1119
  let SqlEventQueryCompiler = class SqlEventQueryCompiler extends SqlQueryCompiler {