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.
- package/CHANGELOG.md +1111 -0
- package/LICENSE +21 -0
- package/README.md +573 -0
- package/dist/audit/history-query.js +180 -0
- package/dist/audit/index.js +23 -0
- package/dist/audit/logger.js +236 -0
- package/dist/cache/cache-manager.js +84 -0
- package/dist/cache/index.js +16 -0
- package/dist/cache/redis-cluster-cache.js +557 -0
- package/dist/cli.js +2200 -0
- package/dist/compliance/audit-trail.js +68 -0
- package/dist/compliance/backup-verification.js +685 -0
- package/dist/compliance/breach-detector.js +505 -0
- package/dist/compliance/consent-record.js +227 -0
- package/dist/compliance/consent-versioning.js +331 -0
- package/dist/compliance/cross-border-log.js +530 -0
- package/dist/compliance/data-classifier.js +258 -0
- package/dist/compliance/data-lineage.js +565 -0
- package/dist/compliance/data-masker.js +303 -0
- package/dist/compliance/data-portability.js +265 -0
- package/dist/compliance/data-retention.js +195 -0
- package/dist/compliance/dsar-workflow.js +342 -0
- package/dist/compliance/field-encryption.js +223 -0
- package/dist/compliance/immutable-record.js +148 -0
- package/dist/compliance/index.js +260 -0
- package/dist/compliance/privacy-impact-assessment.js +364 -0
- package/dist/compliance/pseudonymization.js +269 -0
- package/dist/compliance/query-firewall.js +1182 -0
- package/dist/compliance/rate-limiter.js +580 -0
- package/dist/compliance/right-to-erasure.js +117 -0
- package/dist/compliance/row-level-security.js +246 -0
- package/dist/compliance/security-decorator.js +574 -0
- package/dist/compliance/security-monitor.js +525 -0
- package/dist/compliance/sensitive-data-discovery.js +476 -0
- package/dist/compliance/session-isolation.js +472 -0
- package/dist/compliance/tls-enforcer.js +108 -0
- package/dist/compliance/worm-storage.js +712 -0
- package/dist/connection-manager.js +198 -0
- package/dist/connection-pool.js +519 -0
- package/dist/decorators/audit.js +136 -0
- package/dist/decorators/belongs-to-many.js +115 -0
- package/dist/decorators/belongs-to.js +115 -0
- package/dist/decorators/check.js +435 -0
- package/dist/decorators/collate.js +329 -0
- package/dist/decorators/comment.js +205 -0
- package/dist/decorators/database-settings.js +236 -0
- package/dist/decorators/default.js +244 -0
- package/dist/decorators/encryption.js +235 -0
- package/dist/decorators/engine.js +97 -0
- package/dist/decorators/fk-constraints.js +594 -0
- package/dist/decorators/foreign-table.js +136 -0
- package/dist/decorators/generated.js +274 -0
- package/dist/decorators/has-many.js +127 -0
- package/dist/decorators/has-one.js +116 -0
- package/dist/decorators/hstore.js +129 -0
- package/dist/decorators/index.js +355 -0
- package/dist/decorators/json-column.js +83 -0
- package/dist/decorators/jsonb.js +101 -0
- package/dist/decorators/orm-decorators.js +425 -0
- package/dist/decorators/permissions.js +294 -0
- package/dist/decorators/procedure.js +210 -0
- package/dist/decorators/query-options.js +556 -0
- package/dist/decorators/range.js +167 -0
- package/dist/decorators/set-column.js +83 -0
- package/dist/decorators/spatial.js +114 -0
- package/dist/decorators/storage.js +580 -0
- package/dist/decorators/timezone.js +512 -0
- package/dist/decorators/trigger.js +90 -0
- package/dist/decorators/uuid.js +135 -0
- package/dist/decorators/view.js +258 -0
- package/dist/diagrams/chen-diagram.js +354 -0
- package/dist/diagrams/class-diagram.js +384 -0
- package/dist/diagrams/dependency-diagram.js +432 -0
- package/dist/diagrams/er-diagram.js +605 -0
- package/dist/diagrams/flow-diagram.js +394 -0
- package/dist/diagrams/gantt-diagram.js +411 -0
- package/dist/diagrams/index-diagram.js +353 -0
- package/dist/diagrams/index.js +184 -0
- package/dist/diagrams/migration-diagram.js +316 -0
- package/dist/diagrams/model-diagram.js +616 -0
- package/dist/diagrams/package-diagram.js +376 -0
- package/dist/diagrams/palette.js +85 -0
- package/dist/diagrams/relational-diagram.js +455 -0
- package/dist/diagrams/schemadoc-diagram.js +309 -0
- package/dist/diagrams/sequence-diagram.js +307 -0
- package/dist/diagrams/state-diagram.js +344 -0
- package/dist/diagrams/svg-dom.js +111 -0
- package/dist/diagrams/tree-diagram.js +250 -0
- package/dist/dialects/clickhouse/index.js +1742 -0
- package/dist/dialects/cockroachdb/index.js +4677 -0
- package/dist/dialects/cratedb/index.js +441 -0
- package/dist/dialects/databricks/index.js +517 -0
- package/dist/dialects/db2/index.js +2225 -0
- package/dist/dialects/dialect.js +720 -0
- package/dist/dialects/duckdb/index.js +2014 -0
- package/dist/dialects/exasol/index.js +357 -0
- package/dist/dialects/firebird/index.js +495 -0
- package/dist/dialects/greenplum/index.js +457 -0
- package/dist/dialects/hana/index.js +1741 -0
- package/dist/dialects/mariadb/index.js +3590 -0
- package/dist/dialects/mssql/index.js +2296 -0
- package/dist/dialects/mysql/index.js +4058 -0
- package/dist/dialects/oracle/index.js +2999 -0
- package/dist/dialects/postgres/index.js +5319 -0
- package/dist/dialects/query-stream-helper.js +152 -0
- package/dist/dialects/questdb/index.js +433 -0
- package/dist/dialects/redshift/index.js +2277 -0
- package/dist/dialects/singlestore/index.js +354 -0
- package/dist/dialects/snowflake/index.js +2082 -0
- package/dist/dialects/spanner/index.js +1768 -0
- package/dist/dialects/sqlite/index.js +3382 -0
- package/dist/dialects/tidb/index.js +377 -0
- package/dist/dialects/timescaledb/index.js +164 -0
- package/dist/dialects/trino/index.js +420 -0
- package/dist/dialects/turso/index.js +227 -0
- package/dist/dialects/vertica/index.js +317 -0
- package/dist/dialects/yugabytedb/index.js +424 -0
- package/dist/errors/index.js +472 -0
- package/dist/errors/utils.js +340 -0
- package/dist/errors.js +21 -0
- package/dist/extensions/catalog/cloud-warehouse-features.js +207 -0
- package/dist/extensions/catalog/mssql-features.js +147 -0
- package/dist/extensions/catalog/mysql-mariadb-plugins.js +229 -0
- package/dist/extensions/catalog/oracle-db2-features.js +196 -0
- package/dist/extensions/catalog/postgres-extensions.js +516 -0
- package/dist/extensions/index.js +71 -0
- package/dist/extensions/types.js +13 -0
- package/dist/foreign-data.js +173 -0
- package/dist/hooks/hooks-manager.js +350 -0
- package/dist/hooks/index.js +37 -0
- package/dist/index.js +463 -0
- package/dist/logging.js +335 -0
- package/dist/migrations/index.js +40 -0
- package/dist/migrations/migration.js +196 -0
- package/dist/migrations/migrator.js +411 -0
- package/dist/migrations/prormmigration.js +275 -0
- package/dist/migrations/query-interface.js +435 -0
- package/dist/migrations/seeder.js +353 -0
- package/dist/models/associations.js +852 -0
- package/dist/models/constraints.js +288 -0
- package/dist/models/data-types.js +2518 -0
- package/dist/models/decorators.js +445 -0
- package/dist/models/index.js +33 -0
- package/dist/models/indexes.js +531 -0
- package/dist/models/methods.js +382 -0
- package/dist/models/model-manager.js +103 -0
- package/dist/models/model.js +5349 -0
- package/dist/models/operators.js +67 -0
- package/dist/models/scopes.js +189 -0
- package/dist/models/typescript-types.js +26 -0
- package/dist/nosql/aerospike/index.js +205 -0
- package/dist/nosql/allegrograph/index.js +169 -0
- package/dist/nosql/arangodb/index.js +364 -0
- package/dist/nosql/azure-blob/index.js +206 -0
- package/dist/nosql/beanstalkd/index.js +231 -0
- package/dist/nosql/beequeue/index.js +210 -0
- package/dist/nosql/bigchaindb/index.js +195 -0
- package/dist/nosql/bigtable/index.js +224 -0
- package/dist/nosql/blazegraph/index.js +173 -0
- package/dist/nosql/bullmq/index.js +191 -0
- package/dist/nosql/cassandra/index.js +174 -0
- package/dist/nosql/chroma/index.js +190 -0
- package/dist/nosql/cloudflare-kv/index.js +220 -0
- package/dist/nosql/coherence/index.js +200 -0
- package/dist/nosql/cosmosdb/index.js +157 -0
- package/dist/nosql/couchbase/index.js +213 -0
- package/dist/nosql/dax/index.js +212 -0
- package/dist/nosql/deno-kv/index.js +206 -0
- package/dist/nosql/dgraph/index.js +171 -0
- package/dist/nosql/doris/index.js +169 -0
- package/dist/nosql/druid/index.js +162 -0
- package/dist/nosql/dynamodb/index.js +937 -0
- package/dist/nosql/elasticsearch/index.js +377 -0
- package/dist/nosql/etcd/index.js +502 -0
- package/dist/nosql/eventhubs/index.js +213 -0
- package/dist/nosql/eventstore/index.js +254 -0
- package/dist/nosql/faunadb/index.js +188 -0
- package/dist/nosql/firestore/index.js +177 -0
- package/dist/nosql/fluree/index.js +148 -0
- package/dist/nosql/fuseki/index.js +170 -0
- package/dist/nosql/gcs/index.js +172 -0
- package/dist/nosql/gearman/index.js +160 -0
- package/dist/nosql/geode/index.js +196 -0
- package/dist/nosql/graphdb/index.js +169 -0
- package/dist/nosql/graylog/index.js +188 -0
- package/dist/nosql/gridgain/index.js +171 -0
- package/dist/nosql/hazelcast/index.js +162 -0
- package/dist/nosql/hbase/index.js +230 -0
- package/dist/nosql/ignite/index.js +173 -0
- package/dist/nosql/immudb/index.js +184 -0
- package/dist/nosql/index.js +232 -0
- package/dist/nosql/infinispan/index.js +200 -0
- package/dist/nosql/influxdb/index.js +0 -0
- package/dist/nosql/kafka/index.js +234 -0
- package/dist/nosql/keyspaces/index.js +189 -0
- package/dist/nosql/kinesis/index.js +253 -0
- package/dist/nosql/leveldb/index.js +153 -0
- package/dist/nosql/lmdb/index.js +160 -0
- package/dist/nosql/loki/index.js +201 -0
- package/dist/nosql/marklogic/index.js +204 -0
- package/dist/nosql/materialize/index.js +145 -0
- package/dist/nosql/meilisearch/index.js +154 -0
- package/dist/nosql/memcached/index.js +223 -0
- package/dist/nosql/milvus/index.js +410 -0
- package/dist/nosql/minio/index.js +265 -0
- package/dist/nosql/momento/index.js +179 -0
- package/dist/nosql/mongodb/index.js +461 -0
- package/dist/nosql/nats/index.js +247 -0
- package/dist/nosql/nedb/index.js +164 -0
- package/dist/nosql/neo4j/index.js +450 -0
- package/dist/nosql/neptune/index.js +470 -0
- package/dist/nosql/nsq/index.js +200 -0
- package/dist/nosql/opensearch/index.js +186 -0
- package/dist/nosql/orientdb/index.js +175 -0
- package/dist/nosql/papertrail/index.js +200 -0
- package/dist/nosql/pinecone/index.js +0 -0
- package/dist/nosql/pinot/index.js +133 -0
- package/dist/nosql/pouchdb/index.js +172 -0
- package/dist/nosql/prometheus/index.js +174 -0
- package/dist/nosql/provendb/index.js +147 -0
- package/dist/nosql/pubsub/index.js +187 -0
- package/dist/nosql/pulsar/index.js +232 -0
- package/dist/nosql/qdrant/index.js +295 -0
- package/dist/nosql/qldb/index.js +192 -0
- package/dist/nosql/r2/index.js +281 -0
- package/dist/nosql/rabbitmq/index.js +237 -0
- package/dist/nosql/ravendb/index.js +175 -0
- package/dist/nosql/redis/index.js +607 -0
- package/dist/nosql/redpanda/index.js +237 -0
- package/dist/nosql/resque/index.js +203 -0
- package/dist/nosql/rethinkdb/index.js +232 -0
- package/dist/nosql/rocksdb/index.js +152 -0
- package/dist/nosql/rockset/index.js +126 -0
- package/dist/nosql/s3/index.js +298 -0
- package/dist/nosql/scylladb/index.js +178 -0
- package/dist/nosql/signoz/index.js +227 -0
- package/dist/nosql/sns/index.js +201 -0
- package/dist/nosql/solr/index.js +231 -0
- package/dist/nosql/splunk/index.js +227 -0
- package/dist/nosql/sqs/index.js +246 -0
- package/dist/nosql/stardog/index.js +169 -0
- package/dist/nosql/starrocks/index.js +170 -0
- package/dist/nosql/store.js +2 -0
- package/dist/nosql/sumologic/index.js +213 -0
- package/dist/nosql/surrealdb/index.js +179 -0
- package/dist/nosql/terminusdb/index.js +151 -0
- package/dist/nosql/tigergraph/index.js +469 -0
- package/dist/nosql/typesense/index.js +148 -0
- package/dist/nosql/unqlite/index.js +157 -0
- package/dist/nosql/upstash/index.js +167 -0
- package/dist/nosql/vercel-kv/index.js +166 -0
- package/dist/nosql/victoriametrics/index.js +213 -0
- package/dist/nosql/virtuoso/index.js +169 -0
- package/dist/nosql/weaviate/index.js +276 -0
- package/dist/operators/index.js +108 -0
- package/dist/operators.js +2690 -0
- package/dist/prisma-migrate/index.js +38 -0
- package/dist/prisma-migrate/migration-generator.js +125 -0
- package/dist/prisma-migrate/model-generator.js +172 -0
- package/dist/prisma-migrate/relations.js +100 -0
- package/dist/prisma-migrate/schema-parser.js +167 -0
- package/dist/prisma-migrate/type-mapper.js +40 -0
- package/dist/prorm.js +6832 -0
- package/dist/query-builders/cte-builder.js +80 -0
- package/dist/query-builders/functions/aggregate.js +390 -0
- package/dist/query-builders/functions/conditional.js +503 -0
- package/dist/query-builders/functions/datetime.js +695 -0
- package/dist/query-builders/functions/fulltext.js +439 -0
- package/dist/query-builders/functions/index.js +93 -0
- package/dist/query-builders/functions/json.js +427 -0
- package/dist/query-builders/functions/math.js +399 -0
- package/dist/query-builders/functions/string.js +518 -0
- package/dist/query-builders/functions/window.js +328 -0
- package/dist/query-builders/include-builder.js +323 -0
- package/dist/query-builders/index-expression-builder.js +242 -0
- package/dist/query-builders/index.js +161 -0
- package/dist/query-builders/insert-builder.js +164 -0
- package/dist/query-builders/model-helpers.js +38 -0
- package/dist/query-builders/order-limit-builder.js +239 -0
- package/dist/query-builders/sql-compiler.js +2040 -0
- package/dist/query-builders/subquery-builder.js +152 -0
- package/dist/query-builders/update-builder.js +182 -0
- package/dist/query-builders/view-builder.js +218 -0
- package/dist/query-builders/where-builder.js +1532 -0
- package/dist/query-interface.js +622 -0
- package/dist/query-optimizers/batch-optimizer.js +426 -0
- package/dist/query-optimizers/explain-plans.js +415 -0
- package/dist/query-optimizers/index.js +51 -0
- package/dist/query-optimizers/prepared-statement-cache.js +423 -0
- package/dist/query-optimizers/query-hints.js +438 -0
- package/dist/query-optimizers/query-optimizer.js +278 -0
- package/dist/query-optimizers/slow-query-logger.js +271 -0
- package/dist/replica-manager.js +507 -0
- package/dist/schema/index.js +15 -0
- package/dist/schema/migration-generator.js +374 -0
- package/dist/schema/schema-differ.js +549 -0
- package/dist/schema/types.js +6 -0
- package/dist/sql-constants.js +300 -0
- package/dist/sqlite-advanced.js +1047 -0
- package/dist/streams/index.js +12 -0
- package/dist/streams/transforms.js +178 -0
- package/dist/transaction.js +456 -0
- package/dist/types/index.js +180 -0
- package/dist/user-management.js +127 -0
- package/dist/utils/date.js +300 -0
- package/dist/utils/index.js +1079 -0
- package/dist/utils/string.js +161 -0
- package/dist/validators/index.js +19 -0
- package/dist/validators/validator.js +911 -0
- 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;
|