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,317 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Vertica dialect implementation for the TypeScript ORM
|
|
4
|
+
*
|
|
5
|
+
* Vertica is an analytic, columnar, massively-parallel-processing (MPP)
|
|
6
|
+
* database. It speaks the PostgreSQL wire protocol on port 5433 and is
|
|
7
|
+
* broadly SQL-compatible with PostgreSQL, so this dialect extends
|
|
8
|
+
* `PostgresDialect` and reuses the `pg` driver, query building, escaping and
|
|
9
|
+
* transaction handling. Only the genuinely Vertica-specific differences are
|
|
10
|
+
* overridden here:
|
|
11
|
+
*
|
|
12
|
+
* - Default port is 5433 (not Postgres's 5432).
|
|
13
|
+
* - CREATE TABLE supports Vertica's columnar/MPP physical-design clauses:
|
|
14
|
+
* * `ORDER BY col, ...` — sort order of the column store.
|
|
15
|
+
* * `SEGMENTED BY HASH(cols) ALL NODES` — hash-distribute rows across
|
|
16
|
+
* all cluster nodes, or `UNSEGMENTED ALL NODES` to replicate the whole
|
|
17
|
+
* table on every node.
|
|
18
|
+
* * `PARTITION BY expr` — data partitioning (partition pruning /
|
|
19
|
+
* fast bulk drop of partitions).
|
|
20
|
+
* These are emitted by the overridden `createTable` via the synchronous
|
|
21
|
+
* `buildCreateTableSql` helper, driven by extra `VerticaTableOptions`.
|
|
22
|
+
* - `CREATE PROJECTION` — projections are Vertica's materialized,
|
|
23
|
+
* pre-sorted/pre-segmented physical storage for a table (its equivalent of
|
|
24
|
+
* an index). `buildCreateProjectionSql`/`createProjection` build that DDL.
|
|
25
|
+
* - Type mapping differs from Postgres:
|
|
26
|
+
* * No SERIAL/BIGSERIAL — auto-increment columns use `IDENTITY`.
|
|
27
|
+
* * Large text/blob use `LONG VARCHAR` / `LONG VARBINARY`.
|
|
28
|
+
* * BOOLEAN is native.
|
|
29
|
+
* `getDataTypeSql` is overridden for these; everything else delegates to the
|
|
30
|
+
* Postgres mapping.
|
|
31
|
+
* - DML differences from Postgres:
|
|
32
|
+
* * No `ON CONFLICT` — upserts are expressed with `MERGE INTO ... USING ...
|
|
33
|
+
* WHEN MATCHED THEN UPDATE ... WHEN NOT MATCHED THEN INSERT ...`.
|
|
34
|
+
* `buildUpsertQuery` and `buildInsertQuery({ upsert: true })` both emit
|
|
35
|
+
* Vertica MERGE instead of the Postgres `INSERT ... ON CONFLICT`.
|
|
36
|
+
* * No `RETURNING` clause on INSERT/UPDATE/DELETE. The Postgres builders
|
|
37
|
+
* append `RETURNING` when asked; the Vertica overrides strip it (Vertica
|
|
38
|
+
* cannot return affected rows inline — read them back with a follow-up
|
|
39
|
+
* SELECT).
|
|
40
|
+
* * `addColumn` uses `IDENTITY` (not SERIAL) for auto-increment columns.
|
|
41
|
+
*
|
|
42
|
+
* Constraint enforcement note: Vertica only *enforces* PRIMARY KEY / UNIQUE /
|
|
43
|
+
* FOREIGN KEY / NOT NULL / CHECK constraints during `COPY`/`ANALYZE_CONSTRAINTS`
|
|
44
|
+
* (or when `ENABLE` is set) — they are otherwise advisory metadata used by the
|
|
45
|
+
* optimizer. Constraint DDL is still emitted (same syntax as Postgres) but a
|
|
46
|
+
* duplicate/violating row is not rejected at INSERT time by default.
|
|
47
|
+
*/
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.VerticaDialect = void 0;
|
|
50
|
+
exports.createVerticaDialect = createVerticaDialect;
|
|
51
|
+
const index_1 = require("../postgres/index");
|
|
52
|
+
/**
|
|
53
|
+
* Vertica dialect class. Extends the PostgreSQL dialect (same pg wire) and
|
|
54
|
+
* overrides only the Vertica-specific type mapping and CREATE TABLE / CREATE
|
|
55
|
+
* PROJECTION DDL.
|
|
56
|
+
*/
|
|
57
|
+
class VerticaDialect extends index_1.PostgresDialect {
|
|
58
|
+
constructor(config = {}) {
|
|
59
|
+
// Vertica's default SQL port is 5433 (not Postgres's 5432).
|
|
60
|
+
super({ port: 5433, ...config });
|
|
61
|
+
this.name = 'vertica';
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Normalize a `string | string[]` column list into a comma-separated,
|
|
65
|
+
* quoted identifier list.
|
|
66
|
+
*/
|
|
67
|
+
columnList(cols) {
|
|
68
|
+
const arr = Array.isArray(cols) ? cols : [cols];
|
|
69
|
+
return arr.map((c) => this.escapeId(c)).join(', ');
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Build the Vertica physical-design tail clauses (`ORDER BY`,
|
|
73
|
+
* `SEGMENTED BY`/`UNSEGMENTED`, `PARTITION BY`) shared by tables and
|
|
74
|
+
* projections. Returns a leading-space-prefixed fragment (possibly empty).
|
|
75
|
+
*/
|
|
76
|
+
buildPhysicalDesignClauses(opts) {
|
|
77
|
+
let sql = '';
|
|
78
|
+
if (opts.orderBy) {
|
|
79
|
+
sql += ` ORDER BY ${this.columnList(opts.orderBy)}`;
|
|
80
|
+
}
|
|
81
|
+
if (opts.unsegmented) {
|
|
82
|
+
sql += ' UNSEGMENTED ALL NODES';
|
|
83
|
+
}
|
|
84
|
+
else if (opts.segmentedBy) {
|
|
85
|
+
sql += ` SEGMENTED BY HASH(${this.columnList(opts.segmentedBy)}) ALL NODES`;
|
|
86
|
+
}
|
|
87
|
+
if (opts.partitionByExpression) {
|
|
88
|
+
sql += ` PARTITION BY ${opts.partitionByExpression}`;
|
|
89
|
+
}
|
|
90
|
+
return sql;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Build a single column definition for a Vertica CREATE TABLE. Handles
|
|
94
|
+
* IDENTITY auto-increment (Vertica has no SERIAL) and otherwise mirrors the
|
|
95
|
+
* common column clauses (NOT NULL, DEFAULT, PRIMARY KEY, UNIQUE, REFERENCES).
|
|
96
|
+
*/
|
|
97
|
+
buildColumnSql(columnName, definition) {
|
|
98
|
+
const dt = definition.type;
|
|
99
|
+
const isAutoInt = definition.autoIncrement && (dt.key === 'INTEGER' || dt.key === 'BIGINT' || !dt.key);
|
|
100
|
+
let sql = `${this.escapeId(columnName)} ${isAutoInt ? 'IDENTITY' : this.getDataTypeSql(definition.type)}`;
|
|
101
|
+
// IDENTITY columns are implicitly NOT NULL and cannot carry a DEFAULT.
|
|
102
|
+
if (!isAutoInt) {
|
|
103
|
+
if (definition.allowNull === false) {
|
|
104
|
+
sql += ' NOT NULL';
|
|
105
|
+
}
|
|
106
|
+
if (definition.defaultValue !== undefined) {
|
|
107
|
+
sql += ` DEFAULT ${this.escape(definition.defaultValue)}`;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (definition.primaryKey) {
|
|
111
|
+
sql += ' PRIMARY KEY';
|
|
112
|
+
}
|
|
113
|
+
if (definition.unique) {
|
|
114
|
+
sql += ' UNIQUE';
|
|
115
|
+
}
|
|
116
|
+
if (definition.references) {
|
|
117
|
+
const refField = definition.references.field;
|
|
118
|
+
const refFieldSql = Array.isArray(refField)
|
|
119
|
+
? `(${refField.map((f) => this.escapeId(f)).join(', ')})`
|
|
120
|
+
: `(${this.escapeId(refField)})`;
|
|
121
|
+
sql += ` REFERENCES ${this.escapeId(definition.references.table)}${refFieldSql}`;
|
|
122
|
+
}
|
|
123
|
+
return sql;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Synchronously build the Vertica `CREATE TABLE ...` statement, including the
|
|
127
|
+
* columnar/MPP `ORDER BY`, `SEGMENTED BY HASH(...) ALL NODES` /
|
|
128
|
+
* `UNSEGMENTED ALL NODES`, and `PARTITION BY` clauses. Exposed as a pure
|
|
129
|
+
* string builder so it can be unit-tested without a live connection.
|
|
130
|
+
*/
|
|
131
|
+
buildCreateTableSql(tableName, columns, options) {
|
|
132
|
+
const columnDefs = Object.entries(columns).map(([name, def]) => this.buildColumnSql(name, def));
|
|
133
|
+
let sql = 'CREATE TABLE';
|
|
134
|
+
if (options?.ifNotExists) {
|
|
135
|
+
sql += ' IF NOT EXISTS';
|
|
136
|
+
}
|
|
137
|
+
sql += ` ${this.escapeId(tableName)} (${columnDefs.join(', ')})`;
|
|
138
|
+
if (options) {
|
|
139
|
+
sql += this.buildPhysicalDesignClauses(options);
|
|
140
|
+
}
|
|
141
|
+
return sql;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Create a table on Vertica, emitting the columnar/MPP physical-design
|
|
145
|
+
* clauses. Overrides the Postgres implementation because Vertica's CREATE
|
|
146
|
+
* TABLE tail differs (ORDER BY / SEGMENTED BY / PARTITION BY) and it has no
|
|
147
|
+
* SERIAL columns.
|
|
148
|
+
*/
|
|
149
|
+
async createTable(tableName, columns, options) {
|
|
150
|
+
await this.query(this.buildCreateTableSql(tableName, columns, options));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Synchronously build a Vertica `CREATE PROJECTION ...` statement. A
|
|
154
|
+
* projection is Vertica's materialized, pre-sorted/pre-segmented physical
|
|
155
|
+
* copy of a table's data (its "index" equivalent).
|
|
156
|
+
*/
|
|
157
|
+
buildCreateProjectionSql(options) {
|
|
158
|
+
let sql = 'CREATE PROJECTION';
|
|
159
|
+
if (options.ifNotExists) {
|
|
160
|
+
sql += ' IF NOT EXISTS';
|
|
161
|
+
}
|
|
162
|
+
sql += ` ${this.escapeId(options.name)}`;
|
|
163
|
+
const cols = options.columns && options.columns.length > 0
|
|
164
|
+
? this.columnList(options.columns)
|
|
165
|
+
: '*';
|
|
166
|
+
sql += ` (${cols})`;
|
|
167
|
+
sql += ` AS SELECT ${cols} FROM ${this.escapeId(options.table)}`;
|
|
168
|
+
sql += this.buildPhysicalDesignClauses({
|
|
169
|
+
orderBy: options.orderBy,
|
|
170
|
+
segmentedBy: options.segmentedBy,
|
|
171
|
+
unsegmented: options.unsegmented,
|
|
172
|
+
});
|
|
173
|
+
return sql;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Create a Vertica projection (materialized columnar storage for a table).
|
|
177
|
+
*/
|
|
178
|
+
async createProjection(options) {
|
|
179
|
+
await this.query(this.buildCreateProjectionSql(options));
|
|
180
|
+
}
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
// DML overrides — Vertica has no ON CONFLICT and no RETURNING.
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
/**
|
|
185
|
+
* Build an INSERT for Vertica.
|
|
186
|
+
*
|
|
187
|
+
* Two differences from the Postgres base:
|
|
188
|
+
* - `upsert: true` routes to a Vertica `MERGE` (Postgres would emit the
|
|
189
|
+
* unsupported `INSERT ... ON CONFLICT`).
|
|
190
|
+
* - `returning` is stripped — Vertica does not support `RETURNING`.
|
|
191
|
+
*/
|
|
192
|
+
buildInsertQuery(tableName, values, options) {
|
|
193
|
+
if (options?.upsert) {
|
|
194
|
+
return this.buildUpsertQuery(tableName, values, {
|
|
195
|
+
conflictFields: options.conflictFields,
|
|
196
|
+
updateOnDuplicate: options.updateOnDuplicate,
|
|
197
|
+
schema: options.schema,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
// Delegate to the Postgres builder but never emit RETURNING.
|
|
201
|
+
return super.buildInsertQuery(tableName, values, this.stripReturning(options));
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Build an upsert for Vertica as a `MERGE INTO ... USING (SELECT ...) ...`
|
|
205
|
+
* statement. Vertica has no `INSERT ... ON CONFLICT`.
|
|
206
|
+
*
|
|
207
|
+
* The inserted row is materialized as a single-row source relation
|
|
208
|
+
* (`SELECT $1 AS col1, $2 AS col2`), joined to the target on `conflictFields`.
|
|
209
|
+
* Matching rows get `UPDATE SET` for the non-key columns (or the explicit
|
|
210
|
+
* `updateOnDuplicate` list); non-matching rows are inserted. `RETURNING` is
|
|
211
|
+
* not supported and is ignored.
|
|
212
|
+
*/
|
|
213
|
+
buildUpsertQuery(tableName, values, options) {
|
|
214
|
+
const columns = Object.keys(values);
|
|
215
|
+
const queryValues = Object.values(values);
|
|
216
|
+
if (!options?.conflictFields || options.conflictFields.length === 0) {
|
|
217
|
+
throw new Error('buildUpsertQuery: options.conflictFields is required - Vertica MERGE needs the ' +
|
|
218
|
+
'key column(s) for its ON join condition, which cannot be inferred from the ' +
|
|
219
|
+
'inserted columns.');
|
|
220
|
+
}
|
|
221
|
+
const conflictFields = options.conflictFields;
|
|
222
|
+
const target = this.quoteTable(tableName, options.schema);
|
|
223
|
+
// Single-row source relation: SELECT $1 AS "col1", $2 AS "col2"
|
|
224
|
+
const sourceSelect = columns
|
|
225
|
+
.map((c, i) => `$${i + 1} AS ${this.escapeId(c)}`)
|
|
226
|
+
.join(', ');
|
|
227
|
+
const onCondition = conflictFields
|
|
228
|
+
.map((c) => `tgt.${this.escapeId(c)} = src.${this.escapeId(c)}`)
|
|
229
|
+
.join(' AND ');
|
|
230
|
+
// Update every non-key column (or the explicit updateOnDuplicate list).
|
|
231
|
+
const candidateUpdateFields = options.updateOnDuplicate && options.updateOnDuplicate.length > 0
|
|
232
|
+
? options.updateOnDuplicate
|
|
233
|
+
: columns;
|
|
234
|
+
const updateFields = candidateUpdateFields.filter((c) => !conflictFields.includes(c));
|
|
235
|
+
let sql = `MERGE INTO ${target} AS tgt USING (SELECT ${sourceSelect}) AS src ON ${onCondition}`;
|
|
236
|
+
if (updateFields.length > 0) {
|
|
237
|
+
const setClause = updateFields
|
|
238
|
+
.map((c) => `${this.escapeId(c)} = src.${this.escapeId(c)}`)
|
|
239
|
+
.join(', ');
|
|
240
|
+
sql += ` WHEN MATCHED THEN UPDATE SET ${setClause}`;
|
|
241
|
+
}
|
|
242
|
+
const insertCols = columns.map((c) => this.escapeId(c)).join(', ');
|
|
243
|
+
const insertVals = columns.map((c) => `src.${this.escapeId(c)}`).join(', ');
|
|
244
|
+
sql += ` WHEN NOT MATCHED THEN INSERT (${insertCols}) VALUES (${insertVals})`;
|
|
245
|
+
return { sql, values: queryValues };
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Build an UPDATE for Vertica. Same as Postgres but `RETURNING` is stripped.
|
|
249
|
+
*/
|
|
250
|
+
buildUpdateQuery(tableName, values, where, options) {
|
|
251
|
+
return super.buildUpdateQuery(tableName, values, where, this.stripReturning(options));
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Build a DELETE for Vertica. Same as Postgres but `RETURNING` is stripped.
|
|
255
|
+
*/
|
|
256
|
+
buildDeleteQuery(tableName, where, options) {
|
|
257
|
+
return super.buildDeleteQuery(tableName, where, this.stripReturning(options));
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Return a shallow copy of the given DML options with any `returning`
|
|
261
|
+
* request removed. Vertica does not support the `RETURNING` clause, so the
|
|
262
|
+
* inherited Postgres builders must not emit it.
|
|
263
|
+
*/
|
|
264
|
+
stripReturning(options) {
|
|
265
|
+
if (!options || options.returning === undefined) {
|
|
266
|
+
return options;
|
|
267
|
+
}
|
|
268
|
+
const { returning, ...rest } = options;
|
|
269
|
+
return rest;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Add a column on Vertica. Overrides the Postgres implementation so that
|
|
273
|
+
* auto-increment columns use `IDENTITY` (Vertica has no SERIAL) and the
|
|
274
|
+
* Vertica column-definition builder is used.
|
|
275
|
+
*/
|
|
276
|
+
async addColumn(tableName, columnName, definition) {
|
|
277
|
+
const sql = `ALTER TABLE ${this.escapeId(tableName)} ADD COLUMN ${this.buildColumnSql(columnName, definition)}`;
|
|
278
|
+
await this.query(sql);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Vertica type mapping. Differs from Postgres in three ways:
|
|
282
|
+
* - auto-increment integers use `IDENTITY` (no SERIAL/BIGSERIAL);
|
|
283
|
+
* - large text/blob map to `LONG VARCHAR` / `LONG VARBINARY`;
|
|
284
|
+
* - BOOLEAN is native.
|
|
285
|
+
* Everything else delegates to the Postgres mapping.
|
|
286
|
+
*/
|
|
287
|
+
getDataTypeSql(dataType) {
|
|
288
|
+
if (dataType && typeof dataType === 'object') {
|
|
289
|
+
const dt = dataType;
|
|
290
|
+
switch (dt.key) {
|
|
291
|
+
case 'INTEGER':
|
|
292
|
+
case 'BIGINT':
|
|
293
|
+
if (dt.autoIncrement) {
|
|
294
|
+
return 'IDENTITY';
|
|
295
|
+
}
|
|
296
|
+
break;
|
|
297
|
+
case 'TEXT':
|
|
298
|
+
// Vertica's large variable-length text type.
|
|
299
|
+
return 'LONG VARCHAR';
|
|
300
|
+
case 'BLOB':
|
|
301
|
+
// Vertica's large variable-length binary type.
|
|
302
|
+
return 'LONG VARBINARY';
|
|
303
|
+
case 'BOOLEAN':
|
|
304
|
+
return 'BOOLEAN';
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return super.getDataTypeSql(dataType);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
exports.VerticaDialect = VerticaDialect;
|
|
311
|
+
/**
|
|
312
|
+
* Create a new Vertica dialect instance
|
|
313
|
+
*/
|
|
314
|
+
function createVerticaDialect(options) {
|
|
315
|
+
return new VerticaDialect(options || {});
|
|
316
|
+
}
|
|
317
|
+
exports.default = VerticaDialect;
|