ts-prorm-orm 1.1.0

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 (310) hide show
  1. package/CHANGELOG.md +1111 -0
  2. package/LICENSE +21 -0
  3. package/README.md +573 -0
  4. package/dist/audit/history-query.js +180 -0
  5. package/dist/audit/index.js +23 -0
  6. package/dist/audit/logger.js +236 -0
  7. package/dist/cache/cache-manager.js +84 -0
  8. package/dist/cache/index.js +16 -0
  9. package/dist/cache/redis-cluster-cache.js +557 -0
  10. package/dist/cli.js +2200 -0
  11. package/dist/compliance/audit-trail.js +68 -0
  12. package/dist/compliance/backup-verification.js +685 -0
  13. package/dist/compliance/breach-detector.js +505 -0
  14. package/dist/compliance/consent-record.js +227 -0
  15. package/dist/compliance/consent-versioning.js +331 -0
  16. package/dist/compliance/cross-border-log.js +530 -0
  17. package/dist/compliance/data-classifier.js +258 -0
  18. package/dist/compliance/data-lineage.js +565 -0
  19. package/dist/compliance/data-masker.js +303 -0
  20. package/dist/compliance/data-portability.js +265 -0
  21. package/dist/compliance/data-retention.js +195 -0
  22. package/dist/compliance/dsar-workflow.js +342 -0
  23. package/dist/compliance/field-encryption.js +223 -0
  24. package/dist/compliance/immutable-record.js +148 -0
  25. package/dist/compliance/index.js +260 -0
  26. package/dist/compliance/privacy-impact-assessment.js +364 -0
  27. package/dist/compliance/pseudonymization.js +269 -0
  28. package/dist/compliance/query-firewall.js +1182 -0
  29. package/dist/compliance/rate-limiter.js +580 -0
  30. package/dist/compliance/right-to-erasure.js +117 -0
  31. package/dist/compliance/row-level-security.js +246 -0
  32. package/dist/compliance/security-decorator.js +574 -0
  33. package/dist/compliance/security-monitor.js +525 -0
  34. package/dist/compliance/sensitive-data-discovery.js +476 -0
  35. package/dist/compliance/session-isolation.js +472 -0
  36. package/dist/compliance/tls-enforcer.js +108 -0
  37. package/dist/compliance/worm-storage.js +712 -0
  38. package/dist/connection-manager.js +198 -0
  39. package/dist/connection-pool.js +519 -0
  40. package/dist/decorators/audit.js +136 -0
  41. package/dist/decorators/belongs-to-many.js +115 -0
  42. package/dist/decorators/belongs-to.js +115 -0
  43. package/dist/decorators/check.js +435 -0
  44. package/dist/decorators/collate.js +329 -0
  45. package/dist/decorators/comment.js +205 -0
  46. package/dist/decorators/database-settings.js +236 -0
  47. package/dist/decorators/default.js +244 -0
  48. package/dist/decorators/encryption.js +235 -0
  49. package/dist/decorators/engine.js +97 -0
  50. package/dist/decorators/fk-constraints.js +594 -0
  51. package/dist/decorators/foreign-table.js +136 -0
  52. package/dist/decorators/generated.js +274 -0
  53. package/dist/decorators/has-many.js +127 -0
  54. package/dist/decorators/has-one.js +116 -0
  55. package/dist/decorators/hstore.js +129 -0
  56. package/dist/decorators/index.js +355 -0
  57. package/dist/decorators/json-column.js +83 -0
  58. package/dist/decorators/jsonb.js +101 -0
  59. package/dist/decorators/orm-decorators.js +425 -0
  60. package/dist/decorators/permissions.js +294 -0
  61. package/dist/decorators/procedure.js +210 -0
  62. package/dist/decorators/query-options.js +556 -0
  63. package/dist/decorators/range.js +167 -0
  64. package/dist/decorators/set-column.js +83 -0
  65. package/dist/decorators/spatial.js +114 -0
  66. package/dist/decorators/storage.js +580 -0
  67. package/dist/decorators/timezone.js +512 -0
  68. package/dist/decorators/trigger.js +90 -0
  69. package/dist/decorators/uuid.js +135 -0
  70. package/dist/decorators/view.js +258 -0
  71. package/dist/diagrams/chen-diagram.js +354 -0
  72. package/dist/diagrams/class-diagram.js +384 -0
  73. package/dist/diagrams/dependency-diagram.js +432 -0
  74. package/dist/diagrams/er-diagram.js +605 -0
  75. package/dist/diagrams/flow-diagram.js +394 -0
  76. package/dist/diagrams/gantt-diagram.js +411 -0
  77. package/dist/diagrams/index-diagram.js +353 -0
  78. package/dist/diagrams/index.js +184 -0
  79. package/dist/diagrams/migration-diagram.js +316 -0
  80. package/dist/diagrams/model-diagram.js +616 -0
  81. package/dist/diagrams/package-diagram.js +376 -0
  82. package/dist/diagrams/palette.js +85 -0
  83. package/dist/diagrams/relational-diagram.js +455 -0
  84. package/dist/diagrams/schemadoc-diagram.js +309 -0
  85. package/dist/diagrams/sequence-diagram.js +307 -0
  86. package/dist/diagrams/state-diagram.js +344 -0
  87. package/dist/diagrams/svg-dom.js +111 -0
  88. package/dist/diagrams/tree-diagram.js +250 -0
  89. package/dist/dialects/clickhouse/index.js +1742 -0
  90. package/dist/dialects/cockroachdb/index.js +4677 -0
  91. package/dist/dialects/cratedb/index.js +441 -0
  92. package/dist/dialects/databricks/index.js +517 -0
  93. package/dist/dialects/db2/index.js +2225 -0
  94. package/dist/dialects/dialect.js +720 -0
  95. package/dist/dialects/duckdb/index.js +2014 -0
  96. package/dist/dialects/exasol/index.js +357 -0
  97. package/dist/dialects/firebird/index.js +495 -0
  98. package/dist/dialects/greenplum/index.js +457 -0
  99. package/dist/dialects/hana/index.js +1741 -0
  100. package/dist/dialects/mariadb/index.js +3590 -0
  101. package/dist/dialects/mssql/index.js +2296 -0
  102. package/dist/dialects/mysql/index.js +4058 -0
  103. package/dist/dialects/oracle/index.js +2999 -0
  104. package/dist/dialects/postgres/index.js +5319 -0
  105. package/dist/dialects/query-stream-helper.js +152 -0
  106. package/dist/dialects/questdb/index.js +433 -0
  107. package/dist/dialects/redshift/index.js +2277 -0
  108. package/dist/dialects/singlestore/index.js +354 -0
  109. package/dist/dialects/snowflake/index.js +2082 -0
  110. package/dist/dialects/spanner/index.js +1768 -0
  111. package/dist/dialects/sqlite/index.js +3382 -0
  112. package/dist/dialects/tidb/index.js +377 -0
  113. package/dist/dialects/timescaledb/index.js +164 -0
  114. package/dist/dialects/trino/index.js +420 -0
  115. package/dist/dialects/turso/index.js +227 -0
  116. package/dist/dialects/vertica/index.js +317 -0
  117. package/dist/dialects/yugabytedb/index.js +424 -0
  118. package/dist/errors/index.js +472 -0
  119. package/dist/errors/utils.js +340 -0
  120. package/dist/errors.js +21 -0
  121. package/dist/extensions/catalog/cloud-warehouse-features.js +207 -0
  122. package/dist/extensions/catalog/mssql-features.js +147 -0
  123. package/dist/extensions/catalog/mysql-mariadb-plugins.js +229 -0
  124. package/dist/extensions/catalog/oracle-db2-features.js +196 -0
  125. package/dist/extensions/catalog/postgres-extensions.js +516 -0
  126. package/dist/extensions/index.js +71 -0
  127. package/dist/extensions/types.js +13 -0
  128. package/dist/foreign-data.js +173 -0
  129. package/dist/hooks/hooks-manager.js +350 -0
  130. package/dist/hooks/index.js +37 -0
  131. package/dist/index.js +463 -0
  132. package/dist/logging.js +335 -0
  133. package/dist/migrations/index.js +40 -0
  134. package/dist/migrations/migration.js +196 -0
  135. package/dist/migrations/migrator.js +411 -0
  136. package/dist/migrations/prormmigration.js +275 -0
  137. package/dist/migrations/query-interface.js +435 -0
  138. package/dist/migrations/seeder.js +353 -0
  139. package/dist/models/associations.js +852 -0
  140. package/dist/models/constraints.js +288 -0
  141. package/dist/models/data-types.js +2518 -0
  142. package/dist/models/decorators.js +445 -0
  143. package/dist/models/index.js +33 -0
  144. package/dist/models/indexes.js +531 -0
  145. package/dist/models/methods.js +382 -0
  146. package/dist/models/model-manager.js +103 -0
  147. package/dist/models/model.js +5349 -0
  148. package/dist/models/operators.js +67 -0
  149. package/dist/models/scopes.js +189 -0
  150. package/dist/models/typescript-types.js +26 -0
  151. package/dist/nosql/aerospike/index.js +205 -0
  152. package/dist/nosql/allegrograph/index.js +169 -0
  153. package/dist/nosql/arangodb/index.js +364 -0
  154. package/dist/nosql/azure-blob/index.js +206 -0
  155. package/dist/nosql/beanstalkd/index.js +231 -0
  156. package/dist/nosql/beequeue/index.js +210 -0
  157. package/dist/nosql/bigchaindb/index.js +195 -0
  158. package/dist/nosql/bigtable/index.js +224 -0
  159. package/dist/nosql/blazegraph/index.js +173 -0
  160. package/dist/nosql/bullmq/index.js +191 -0
  161. package/dist/nosql/cassandra/index.js +174 -0
  162. package/dist/nosql/chroma/index.js +190 -0
  163. package/dist/nosql/cloudflare-kv/index.js +220 -0
  164. package/dist/nosql/coherence/index.js +200 -0
  165. package/dist/nosql/cosmosdb/index.js +157 -0
  166. package/dist/nosql/couchbase/index.js +213 -0
  167. package/dist/nosql/dax/index.js +212 -0
  168. package/dist/nosql/deno-kv/index.js +206 -0
  169. package/dist/nosql/dgraph/index.js +171 -0
  170. package/dist/nosql/doris/index.js +169 -0
  171. package/dist/nosql/druid/index.js +162 -0
  172. package/dist/nosql/dynamodb/index.js +937 -0
  173. package/dist/nosql/elasticsearch/index.js +377 -0
  174. package/dist/nosql/etcd/index.js +502 -0
  175. package/dist/nosql/eventhubs/index.js +213 -0
  176. package/dist/nosql/eventstore/index.js +254 -0
  177. package/dist/nosql/faunadb/index.js +188 -0
  178. package/dist/nosql/firestore/index.js +177 -0
  179. package/dist/nosql/fluree/index.js +148 -0
  180. package/dist/nosql/fuseki/index.js +170 -0
  181. package/dist/nosql/gcs/index.js +172 -0
  182. package/dist/nosql/gearman/index.js +160 -0
  183. package/dist/nosql/geode/index.js +196 -0
  184. package/dist/nosql/graphdb/index.js +169 -0
  185. package/dist/nosql/graylog/index.js +188 -0
  186. package/dist/nosql/gridgain/index.js +171 -0
  187. package/dist/nosql/hazelcast/index.js +162 -0
  188. package/dist/nosql/hbase/index.js +230 -0
  189. package/dist/nosql/ignite/index.js +173 -0
  190. package/dist/nosql/immudb/index.js +184 -0
  191. package/dist/nosql/index.js +232 -0
  192. package/dist/nosql/infinispan/index.js +200 -0
  193. package/dist/nosql/influxdb/index.js +0 -0
  194. package/dist/nosql/kafka/index.js +234 -0
  195. package/dist/nosql/keyspaces/index.js +189 -0
  196. package/dist/nosql/kinesis/index.js +253 -0
  197. package/dist/nosql/leveldb/index.js +153 -0
  198. package/dist/nosql/lmdb/index.js +160 -0
  199. package/dist/nosql/loki/index.js +201 -0
  200. package/dist/nosql/marklogic/index.js +204 -0
  201. package/dist/nosql/materialize/index.js +145 -0
  202. package/dist/nosql/meilisearch/index.js +154 -0
  203. package/dist/nosql/memcached/index.js +223 -0
  204. package/dist/nosql/milvus/index.js +410 -0
  205. package/dist/nosql/minio/index.js +265 -0
  206. package/dist/nosql/momento/index.js +179 -0
  207. package/dist/nosql/mongodb/index.js +461 -0
  208. package/dist/nosql/nats/index.js +247 -0
  209. package/dist/nosql/nedb/index.js +164 -0
  210. package/dist/nosql/neo4j/index.js +450 -0
  211. package/dist/nosql/neptune/index.js +470 -0
  212. package/dist/nosql/nsq/index.js +200 -0
  213. package/dist/nosql/opensearch/index.js +186 -0
  214. package/dist/nosql/orientdb/index.js +175 -0
  215. package/dist/nosql/papertrail/index.js +200 -0
  216. package/dist/nosql/pinecone/index.js +0 -0
  217. package/dist/nosql/pinot/index.js +133 -0
  218. package/dist/nosql/pouchdb/index.js +172 -0
  219. package/dist/nosql/prometheus/index.js +174 -0
  220. package/dist/nosql/provendb/index.js +147 -0
  221. package/dist/nosql/pubsub/index.js +187 -0
  222. package/dist/nosql/pulsar/index.js +232 -0
  223. package/dist/nosql/qdrant/index.js +295 -0
  224. package/dist/nosql/qldb/index.js +192 -0
  225. package/dist/nosql/r2/index.js +281 -0
  226. package/dist/nosql/rabbitmq/index.js +237 -0
  227. package/dist/nosql/ravendb/index.js +175 -0
  228. package/dist/nosql/redis/index.js +607 -0
  229. package/dist/nosql/redpanda/index.js +237 -0
  230. package/dist/nosql/resque/index.js +203 -0
  231. package/dist/nosql/rethinkdb/index.js +232 -0
  232. package/dist/nosql/rocksdb/index.js +152 -0
  233. package/dist/nosql/rockset/index.js +126 -0
  234. package/dist/nosql/s3/index.js +298 -0
  235. package/dist/nosql/scylladb/index.js +178 -0
  236. package/dist/nosql/signoz/index.js +227 -0
  237. package/dist/nosql/sns/index.js +201 -0
  238. package/dist/nosql/solr/index.js +231 -0
  239. package/dist/nosql/splunk/index.js +227 -0
  240. package/dist/nosql/sqs/index.js +246 -0
  241. package/dist/nosql/stardog/index.js +169 -0
  242. package/dist/nosql/starrocks/index.js +170 -0
  243. package/dist/nosql/store.js +2 -0
  244. package/dist/nosql/sumologic/index.js +213 -0
  245. package/dist/nosql/surrealdb/index.js +179 -0
  246. package/dist/nosql/terminusdb/index.js +151 -0
  247. package/dist/nosql/tigergraph/index.js +469 -0
  248. package/dist/nosql/typesense/index.js +148 -0
  249. package/dist/nosql/unqlite/index.js +157 -0
  250. package/dist/nosql/upstash/index.js +167 -0
  251. package/dist/nosql/vercel-kv/index.js +166 -0
  252. package/dist/nosql/victoriametrics/index.js +213 -0
  253. package/dist/nosql/virtuoso/index.js +169 -0
  254. package/dist/nosql/weaviate/index.js +276 -0
  255. package/dist/operators/index.js +108 -0
  256. package/dist/operators.js +2690 -0
  257. package/dist/prisma-migrate/index.js +38 -0
  258. package/dist/prisma-migrate/migration-generator.js +125 -0
  259. package/dist/prisma-migrate/model-generator.js +172 -0
  260. package/dist/prisma-migrate/relations.js +100 -0
  261. package/dist/prisma-migrate/schema-parser.js +167 -0
  262. package/dist/prisma-migrate/type-mapper.js +40 -0
  263. package/dist/prorm.js +6832 -0
  264. package/dist/query-builders/cte-builder.js +80 -0
  265. package/dist/query-builders/functions/aggregate.js +390 -0
  266. package/dist/query-builders/functions/conditional.js +503 -0
  267. package/dist/query-builders/functions/datetime.js +695 -0
  268. package/dist/query-builders/functions/fulltext.js +439 -0
  269. package/dist/query-builders/functions/index.js +93 -0
  270. package/dist/query-builders/functions/json.js +427 -0
  271. package/dist/query-builders/functions/math.js +399 -0
  272. package/dist/query-builders/functions/string.js +518 -0
  273. package/dist/query-builders/functions/window.js +328 -0
  274. package/dist/query-builders/include-builder.js +323 -0
  275. package/dist/query-builders/index-expression-builder.js +242 -0
  276. package/dist/query-builders/index.js +161 -0
  277. package/dist/query-builders/insert-builder.js +164 -0
  278. package/dist/query-builders/model-helpers.js +38 -0
  279. package/dist/query-builders/order-limit-builder.js +239 -0
  280. package/dist/query-builders/sql-compiler.js +2040 -0
  281. package/dist/query-builders/subquery-builder.js +152 -0
  282. package/dist/query-builders/update-builder.js +182 -0
  283. package/dist/query-builders/view-builder.js +218 -0
  284. package/dist/query-builders/where-builder.js +1532 -0
  285. package/dist/query-interface.js +622 -0
  286. package/dist/query-optimizers/batch-optimizer.js +426 -0
  287. package/dist/query-optimizers/explain-plans.js +415 -0
  288. package/dist/query-optimizers/index.js +51 -0
  289. package/dist/query-optimizers/prepared-statement-cache.js +423 -0
  290. package/dist/query-optimizers/query-hints.js +438 -0
  291. package/dist/query-optimizers/query-optimizer.js +278 -0
  292. package/dist/query-optimizers/slow-query-logger.js +271 -0
  293. package/dist/replica-manager.js +507 -0
  294. package/dist/schema/index.js +15 -0
  295. package/dist/schema/migration-generator.js +374 -0
  296. package/dist/schema/schema-differ.js +549 -0
  297. package/dist/schema/types.js +6 -0
  298. package/dist/sql-constants.js +300 -0
  299. package/dist/sqlite-advanced.js +1047 -0
  300. package/dist/streams/index.js +12 -0
  301. package/dist/streams/transforms.js +178 -0
  302. package/dist/transaction.js +456 -0
  303. package/dist/types/index.js +180 -0
  304. package/dist/user-management.js +127 -0
  305. package/dist/utils/date.js +300 -0
  306. package/dist/utils/index.js +1079 -0
  307. package/dist/utils/string.js +161 -0
  308. package/dist/validators/index.js +19 -0
  309. package/dist/validators/validator.js +911 -0
  310. package/package.json +190 -0
@@ -0,0 +1,354 @@
1
+ "use strict";
2
+ /**
3
+ * SingleStore (formerly MemSQL) dialect implementation for the TypeScript ORM.
4
+ *
5
+ * SingleStore is MySQL-wire-compatible, so this dialect extends
6
+ * {@link MySQLDialect} and reuses the exact same `mysql2` driver, connection
7
+ * pooling, query execution, escaping, WHERE/ORDER/INSERT/UPDATE/DELETE/SELECT
8
+ * builders, JSON helpers, etc. Only the grammar that genuinely differs from
9
+ * stock MySQL is overridden here.
10
+ *
11
+ * Notable differences from the MySQL dialect:
12
+ *
13
+ * - `name` is `'singlestore'` (the driver/`library` is still `'mysql2'`).
14
+ * - Default SQL port is 3306 (same wire protocol as MySQL).
15
+ * - Table storage kind: SingleStore tables are columnstore by default. A
16
+ * `ROWSTORE` table can be requested with `{ rowstore: true }`, which emits
17
+ * `CREATE ROWSTORE TABLE ...`.
18
+ * - `SHARD KEY (cols)`: SingleStore is a distributed database and shards data
19
+ * across leaf nodes by a shard key. `{ shardKey: ['id'] }` emits
20
+ * `SHARD KEY (id)`. An empty array (`{ shardKey: [] }`) emits a keyless
21
+ * `SHARD KEY ()` (random sharding), which is also how a plain distributed
22
+ * table with no explicit shard key is declared.
23
+ * - `SORT KEY (cols)`: columnstore tables store rows ordered by a sort key.
24
+ * `{ sortKey: ['created_at'] }` emits `SORT KEY (created_at)`.
25
+ * - `KEY (...) USING CLUSTERED COLUMNSTORE`: the explicit clustered-columnstore
26
+ * key form, requested with `{ columnstoreKey: { fields: [...] } }`.
27
+ * - Reference tables: `{ reference: true }` emits `CREATE REFERENCE TABLE ...`.
28
+ * Reference tables are fully replicated to every node (rather than sharded),
29
+ * and are typically used for small dimension tables joined against large
30
+ * sharded fact tables.
31
+ *
32
+ * CAVEAT — foreign keys: SingleStore does NOT support foreign key constraints
33
+ * (a real server rejects `FOREIGN KEY ... REFERENCES ...`). This dialect
34
+ * therefore refuses to emit FK SQL rather than generating statements that
35
+ * would fail:
36
+ * - CREATE TABLE: table-level FOREIGN KEY constraints and column-level
37
+ * `references` are omitted (the table is still created, minus the FK).
38
+ * - {@link addForeignKey} and {@link createConstraint} with a FOREIGN KEY
39
+ * type throw a clear error.
40
+ * - {@link addColumn} / {@link changeColumn} strip any column `references`.
41
+ * Enforce referential integrity in application code instead.
42
+ *
43
+ * CAVEAT — upserts: SingleStore's `ON DUPLICATE KEY UPDATE` uses the classic
44
+ * `VALUES(col)` reference, not the MySQL 8.0.19 row-alias form
45
+ * (`... AS new_row ... = new_row.col`) that the MySQL base emits. This dialect
46
+ * overrides {@link buildInsertQuery} / {@link buildUpsertQuery} to emit the
47
+ * `VALUES(col)` form.
48
+ *
49
+ * CAVEAT — unique constraints on columnstore tables must include the shard key;
50
+ * this is a SingleStore data-distribution rule that the ORM does not attempt to
51
+ * police.
52
+ */
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ exports.SingleStoreDialect = void 0;
55
+ const index_1 = require("../mysql/index");
56
+ const prorm_1 = require("../../prorm");
57
+ /**
58
+ * SingleStore dialect. Reuses the MySQL (`mysql2`) driver and all of
59
+ * MySQLDialect's behavior, overriding only the CREATE TABLE grammar that
60
+ * differs (storage kind, SHARD KEY, SORT KEY, clustered columnstore key,
61
+ * reference tables).
62
+ */
63
+ class SingleStoreDialect extends index_1.MySQLDialect {
64
+ constructor(config) {
65
+ // SingleStore speaks the MySQL wire protocol on port 3306 by default.
66
+ super({ port: 3306, ...config });
67
+ this.name = 'singlestore';
68
+ }
69
+ /**
70
+ * Build the `CREATE TABLE` SQL string for SingleStore, synchronously.
71
+ *
72
+ * Exposed as a standalone (non-async, no I/O) method so the emitted grammar
73
+ * can be inspected/tested without a live connection. `createTable()` below
74
+ * delegates to it.
75
+ */
76
+ buildCreateTableSQL(tableName, columns, options) {
77
+ const opts = options || {};
78
+ const parts = [];
79
+ for (const [columnName, definition] of Object.entries(columns)) {
80
+ parts.push(this.buildColumnSQL(columnName, definition));
81
+ }
82
+ // Table-level constraints (PRIMARY KEY / UNIQUE / CHECK). FOREIGN KEY
83
+ // constraints are omitted — SingleStore does not support them (see the
84
+ // file header caveat and buildTableConstraintSQL).
85
+ if (opts.constraints) {
86
+ for (const constraint of opts.constraints) {
87
+ const sql = this.buildTableConstraintSQL(constraint);
88
+ if (sql)
89
+ parts.push(sql);
90
+ }
91
+ }
92
+ // SHARD KEY (...) — distributed data-placement key. An empty array
93
+ // produces the keyless `SHARD KEY ()` form (random sharding).
94
+ if (opts.shardKey !== undefined) {
95
+ const cols = opts.shardKey.map((c) => this.escapeId(c)).join(', ');
96
+ parts.push(`SHARD KEY (${cols})`);
97
+ }
98
+ // SORT KEY (...) — columnstore ordering key.
99
+ if (opts.sortKey && opts.sortKey.length > 0) {
100
+ const cols = opts.sortKey.map((c) => this.escapeId(c)).join(', ');
101
+ parts.push(`SORT KEY (${cols})`);
102
+ }
103
+ // KEY (...) USING CLUSTERED COLUMNSTORE — explicit clustered columnstore key.
104
+ if (opts.columnstoreKey && opts.columnstoreKey.fields.length > 0) {
105
+ const cols = opts.columnstoreKey.fields.map((c) => this.escapeId(c)).join(', ');
106
+ parts.push(`KEY (${cols}) USING CLUSTERED COLUMNSTORE`);
107
+ }
108
+ // CREATE [ROWSTORE] [REFERENCE] TABLE [IF NOT EXISTS] name (...)
109
+ let sql = 'CREATE';
110
+ if (opts.rowstore) {
111
+ sql += ' ROWSTORE';
112
+ }
113
+ if (opts.reference) {
114
+ sql += ' REFERENCE';
115
+ }
116
+ sql += ' TABLE';
117
+ if (opts.ifNotExists) {
118
+ sql += ' IF NOT EXISTS';
119
+ }
120
+ sql += ` ${this.escapeId(tableName)} (${parts.join(', ')})`;
121
+ if (opts.charset) {
122
+ sql += ` DEFAULT CHARSET=${opts.charset}`;
123
+ }
124
+ if (opts.collate) {
125
+ sql += ` COLLATE ${opts.collate}`;
126
+ }
127
+ if (opts.comment) {
128
+ sql += ` COMMENT=${this.escape(opts.comment)}`;
129
+ }
130
+ return sql;
131
+ }
132
+ /**
133
+ * Create a new table using SingleStore grammar. Overrides MySQLDialect's
134
+ * createTable so shard/sort/columnstore keys and storage kind are honored.
135
+ */
136
+ async createTable(tableName, columns, options) {
137
+ await this.query(this.buildCreateTableSQL(tableName, columns, options));
138
+ // Secondary indexes are created after the table, same as the MySQL base.
139
+ if (options?.indexes) {
140
+ for (const index of options.indexes) {
141
+ await this.addIndex(tableName, index.name || `idx_${tableName}_${index.fields.join('_')}`, index.fields, {
142
+ unique: index.unique,
143
+ type: index.type,
144
+ using: index.using,
145
+ where: index.where,
146
+ expression: index.expression,
147
+ include: index.include,
148
+ });
149
+ }
150
+ }
151
+ }
152
+ /**
153
+ * Build a single column definition. Reimplemented here (rather than reusing
154
+ * MySQLDialect's private helper) using only public dialect methods, so the
155
+ * synchronous SQL builder stays self-contained.
156
+ */
157
+ buildColumnSQL(columnName, definition) {
158
+ let sql = `${this.escapeId(columnName)} ${this.getDataTypeSql(definition.type)}`;
159
+ if (definition.allowNull === false) {
160
+ sql += ' NOT NULL';
161
+ }
162
+ if (definition.defaultValue !== undefined) {
163
+ sql += ` DEFAULT ${this.formatDefaultValue(definition.defaultValue)}`;
164
+ }
165
+ if (definition.primaryKey) {
166
+ sql += ' PRIMARY KEY';
167
+ }
168
+ if (definition.autoIncrement) {
169
+ sql += ' AUTO_INCREMENT';
170
+ }
171
+ if (definition.unique) {
172
+ sql += typeof definition.unique === 'string'
173
+ ? ` UNIQUE KEY ${this.escapeId(definition.unique)}`
174
+ : ' UNIQUE';
175
+ }
176
+ if (definition.comment) {
177
+ sql += ` COMMENT ${this.escape(definition.comment)}`;
178
+ }
179
+ return sql;
180
+ }
181
+ /**
182
+ * Build a table-level constraint clause.
183
+ *
184
+ * SingleStore does NOT support FOREIGN KEY constraints — a real server
185
+ * rejects `FOREIGN KEY (...) REFERENCES ...` in CREATE TABLE with a syntax
186
+ * error. So FOREIGN KEY constraints are silently OMITTED here (the table is
187
+ * still created without the referential-integrity clause) rather than
188
+ * emitting SQL that would fail. PRIMARY KEY / UNIQUE / CHECK are supported
189
+ * and emitted normally.
190
+ */
191
+ buildTableConstraintSQL(constraint) {
192
+ const name = constraint.name ? `CONSTRAINT ${this.escapeId(constraint.name)} ` : '';
193
+ const fields = (constraint.fields || []).map((f) => this.escapeId(f)).join(', ');
194
+ switch (constraint.type) {
195
+ case 'PRIMARY KEY':
196
+ return `${name}PRIMARY KEY (${fields})`;
197
+ case 'UNIQUE':
198
+ return `${name}UNIQUE (${fields})`;
199
+ case 'CHECK':
200
+ return constraint.check ? `${name}CHECK (${constraint.check})` : null;
201
+ case 'FOREIGN KEY':
202
+ // SingleStore does not support foreign keys — omit the clause.
203
+ return null;
204
+ default:
205
+ return null;
206
+ }
207
+ }
208
+ /**
209
+ * Map an ORM DataType to SingleStore column SQL.
210
+ *
211
+ * SingleStore is largely MySQL-type-compatible, so the MySQL mapping is
212
+ * reused for everything EXCEPT geospatial types: SingleStore has a native
213
+ * `GEOGRAPHY` type (and `GEOGRAPHYPOINT`), whereas stock MySQL has no
214
+ * `GEOGRAPHY` type and the base dialect degrades it to `GEOMETRY`. Emit the
215
+ * native SingleStore type instead so geography columns round-trip correctly.
216
+ */
217
+ getDataTypeSql(dataType) {
218
+ if (dataType && typeof dataType === 'object') {
219
+ const dt = dataType;
220
+ if (dt.key === 'GEOGRAPHY') {
221
+ return 'GEOGRAPHY';
222
+ }
223
+ }
224
+ return super.getDataTypeSql(dataType);
225
+ }
226
+ /**
227
+ * Build an INSERT query.
228
+ *
229
+ * Overrides the MySQL base ONLY for the upsert (`ON DUPLICATE KEY UPDATE`)
230
+ * branch: the base uses the row-alias form (`... AS new_vals ON DUPLICATE
231
+ * KEY UPDATE col = new_vals.col`) introduced in MySQL 8.0.19, which
232
+ * SingleStore does not support. SingleStore uses the classic
233
+ * `VALUES(col)` reference instead. The plain (non-upsert) INSERT is
234
+ * identical to MySQL.
235
+ */
236
+ buildInsertQuery(tableName, values, options) {
237
+ const columns = Object.keys(values);
238
+ const processedValues = [];
239
+ const placeholders = [];
240
+ for (const value of Object.values(values)) {
241
+ if (value instanceof prorm_1.Literal) {
242
+ placeholders.push(value.val);
243
+ }
244
+ else {
245
+ placeholders.push('?');
246
+ processedValues.push(value);
247
+ }
248
+ }
249
+ let sql = `INSERT INTO ${this.escapeId(tableName)} (${columns
250
+ .map((c) => this.escapeId(c))
251
+ .join(', ')}) VALUES (${placeholders.join(', ')})`;
252
+ if (options?.upsert) {
253
+ const updateFields = options.updateOnDuplicate && options.updateOnDuplicate.length > 0
254
+ ? options.updateOnDuplicate
255
+ : columns;
256
+ const updateColumns = updateFields
257
+ .map((c) => `${this.escapeId(c)} = VALUES(${this.escapeId(c)})`)
258
+ .join(', ');
259
+ sql += ` ON DUPLICATE KEY UPDATE ${updateColumns}`;
260
+ }
261
+ return { sql, values: processedValues };
262
+ }
263
+ /**
264
+ * Build an UPSERT query (`INSERT ... ON DUPLICATE KEY UPDATE`).
265
+ *
266
+ * Uses the classic `VALUES(col)` form rather than the MySQL 8.0.19 row-alias
267
+ * form the base emits, since SingleStore does not support the row alias.
268
+ * Like MySQL, SingleStore has no `RETURNING` clause, so a `returning`
269
+ * request fails fast.
270
+ */
271
+ buildUpsertQuery(tableName, values, options) {
272
+ const columns = Object.keys(values);
273
+ const processedValues = [];
274
+ const placeholders = [];
275
+ for (const value of Object.values(values)) {
276
+ if (value instanceof prorm_1.Literal) {
277
+ placeholders.push(value.val);
278
+ }
279
+ else {
280
+ placeholders.push('?');
281
+ processedValues.push(value);
282
+ }
283
+ }
284
+ const updateFields = options?.updateOnDuplicate && options.updateOnDuplicate.length > 0
285
+ ? options.updateOnDuplicate
286
+ : columns;
287
+ let sql = `INSERT INTO ${this.escapeId(tableName)} (${columns
288
+ .map((c) => this.escapeId(c))
289
+ .join(', ')}) VALUES (${placeholders.join(', ')})`;
290
+ const updateClauses = updateFields
291
+ .map((c) => `${this.escapeId(c)} = VALUES(${this.escapeId(c)})`)
292
+ .join(', ');
293
+ sql += ` ON DUPLICATE KEY UPDATE ${updateClauses}`;
294
+ if (options?.returning) {
295
+ throw new Error('SingleStore does not support the RETURNING clause. Re-fetch the row after the upsert instead.');
296
+ }
297
+ return { sql, values: processedValues };
298
+ }
299
+ /**
300
+ * Add a column. SingleStore does not support foreign keys, so any
301
+ * column-level `references` is stripped before delegating to the MySQL base
302
+ * (whose column builder would otherwise emit a `REFERENCES ...` clause that
303
+ * SingleStore rejects).
304
+ */
305
+ async addColumn(tableName, columnName, definition) {
306
+ return super.addColumn(tableName, columnName, this.stripReferences(definition));
307
+ }
308
+ /**
309
+ * Change a column. As with {@link addColumn}, any column-level `references`
310
+ * is stripped since SingleStore does not support foreign keys.
311
+ */
312
+ async changeColumn(tableName, columnName, definition) {
313
+ return super.changeColumn(tableName, columnName, this.stripReferences(definition));
314
+ }
315
+ /**
316
+ * SingleStore does not support foreign key constraints. Reject explicit
317
+ * foreign-key operations with a clear error rather than emitting SQL a real
318
+ * server would refuse.
319
+ */
320
+ async addForeignKey(_tableName, _columnName, _referencedTableName, _referencedColumnName, _options) {
321
+ throw new Error('SingleStore does not support foreign key constraints. Enforce referential integrity in application code instead.');
322
+ }
323
+ /**
324
+ * Create a constraint. PRIMARY KEY / UNIQUE / CHECK delegate to the MySQL
325
+ * base; FOREIGN KEY is rejected because SingleStore does not support it.
326
+ */
327
+ async createConstraint(tableName, constraintDef) {
328
+ if (constraintDef.type === 'FOREIGN KEY') {
329
+ throw new Error('SingleStore does not support foreign key constraints. Enforce referential integrity in application code instead.');
330
+ }
331
+ return super.createConstraint(tableName, constraintDef);
332
+ }
333
+ /** Return a shallow copy of the column definition without its `references`. */
334
+ stripReferences(definition) {
335
+ if (!definition.references) {
336
+ return definition;
337
+ }
338
+ const { references: _references, ...rest } = definition;
339
+ return rest;
340
+ }
341
+ /**
342
+ * Format a column DEFAULT value. Passes SQL functions (CURRENT_TIMESTAMP,
343
+ * etc.) and NULL through unquoted; everything else is escaped via the
344
+ * shared `escape()`.
345
+ */
346
+ formatDefaultValue(value) {
347
+ if (typeof value === 'string' &&
348
+ (value.toUpperCase().includes('CURRENT_') || value.toUpperCase() === 'NULL')) {
349
+ return value;
350
+ }
351
+ return this.escape(value);
352
+ }
353
+ }
354
+ exports.SingleStoreDialect = SingleStoreDialect;