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,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;