@memberjunction/sql-dialect 0.0.1 → 5.6.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.
@@ -0,0 +1,392 @@
1
+ import { SQLDialect, } from './sqlDialect.js';
2
+ /**
3
+ * PostgreSQL data type mapping.
4
+ * Maps SQL Server types to their PostgreSQL equivalents.
5
+ */
6
+ class PostgreSQLDataTypeMap {
7
+ MapType(sourceType, sourceLength, sourcePrecision, sourceScale) {
8
+ const normalized = sourceType.toUpperCase().trim();
9
+ switch (normalized) {
10
+ case 'UNIQUEIDENTIFIER':
11
+ return { typeName: 'UUID', supportsLength: false, supportsPrecisionScale: false };
12
+ case 'NVARCHAR':
13
+ return this.mapNVarchar(sourceLength);
14
+ case 'VARCHAR':
15
+ return this.mapVarchar(sourceLength);
16
+ case 'NCHAR':
17
+ case 'CHAR':
18
+ return { typeName: 'CHAR', supportsLength: true, supportsPrecisionScale: false, defaultLength: sourceLength ?? 1 };
19
+ case 'INT':
20
+ case 'INTEGER':
21
+ return { typeName: 'INTEGER', supportsLength: false, supportsPrecisionScale: false };
22
+ case 'BIGINT':
23
+ return { typeName: 'BIGINT', supportsLength: false, supportsPrecisionScale: false };
24
+ case 'SMALLINT':
25
+ return { typeName: 'SMALLINT', supportsLength: false, supportsPrecisionScale: false };
26
+ case 'TINYINT':
27
+ return { typeName: 'SMALLINT', supportsLength: false, supportsPrecisionScale: false };
28
+ case 'BIT':
29
+ return { typeName: 'BOOLEAN', supportsLength: false, supportsPrecisionScale: false };
30
+ case 'DECIMAL':
31
+ case 'NUMERIC':
32
+ return { typeName: 'NUMERIC', supportsLength: false, supportsPrecisionScale: true };
33
+ case 'FLOAT':
34
+ return this.mapFloat(sourcePrecision);
35
+ case 'REAL':
36
+ return { typeName: 'REAL', supportsLength: false, supportsPrecisionScale: false };
37
+ case 'MONEY':
38
+ return { typeName: 'NUMERIC(19,4)', supportsLength: false, supportsPrecisionScale: false };
39
+ case 'SMALLMONEY':
40
+ return { typeName: 'NUMERIC(10,4)', supportsLength: false, supportsPrecisionScale: false };
41
+ case 'DATE':
42
+ return { typeName: 'DATE', supportsLength: false, supportsPrecisionScale: false };
43
+ case 'DATETIME':
44
+ case 'DATETIME2':
45
+ return { typeName: 'TIMESTAMP', supportsLength: false, supportsPrecisionScale: false };
46
+ case 'DATETIMEOFFSET':
47
+ return { typeName: 'TIMESTAMPTZ', supportsLength: false, supportsPrecisionScale: false };
48
+ case 'SMALLDATETIME':
49
+ return { typeName: 'TIMESTAMP(0)', supportsLength: false, supportsPrecisionScale: false };
50
+ case 'TIME':
51
+ return { typeName: 'TIME', supportsLength: false, supportsPrecisionScale: false };
52
+ case 'TEXT':
53
+ case 'NTEXT':
54
+ return { typeName: 'TEXT', supportsLength: false, supportsPrecisionScale: false };
55
+ case 'IMAGE':
56
+ return { typeName: 'BYTEA', supportsLength: false, supportsPrecisionScale: false };
57
+ case 'VARBINARY':
58
+ return { typeName: 'BYTEA', supportsLength: false, supportsPrecisionScale: false };
59
+ case 'BINARY':
60
+ return { typeName: 'BYTEA', supportsLength: false, supportsPrecisionScale: false };
61
+ case 'XML':
62
+ return { typeName: 'XML', supportsLength: false, supportsPrecisionScale: false };
63
+ // PostgreSQL native types (pass through)
64
+ case 'UUID':
65
+ return { typeName: 'UUID', supportsLength: false, supportsPrecisionScale: false };
66
+ case 'BOOLEAN':
67
+ return { typeName: 'BOOLEAN', supportsLength: false, supportsPrecisionScale: false };
68
+ case 'TIMESTAMPTZ':
69
+ return { typeName: 'TIMESTAMPTZ', supportsLength: false, supportsPrecisionScale: false };
70
+ case 'TIMESTAMP':
71
+ return { typeName: 'TIMESTAMP', supportsLength: false, supportsPrecisionScale: false };
72
+ case 'BYTEA':
73
+ return { typeName: 'BYTEA', supportsLength: false, supportsPrecisionScale: false };
74
+ case 'JSONB':
75
+ return { typeName: 'JSONB', supportsLength: false, supportsPrecisionScale: false };
76
+ case 'JSON':
77
+ return { typeName: 'JSON', supportsLength: false, supportsPrecisionScale: false };
78
+ case 'SERIAL':
79
+ return { typeName: 'SERIAL', supportsLength: false, supportsPrecisionScale: false };
80
+ case 'BIGSERIAL':
81
+ return { typeName: 'BIGSERIAL', supportsLength: false, supportsPrecisionScale: false };
82
+ case 'DOUBLE PRECISION':
83
+ return { typeName: 'DOUBLE PRECISION', supportsLength: false, supportsPrecisionScale: false };
84
+ default:
85
+ return { typeName: normalized, supportsLength: false, supportsPrecisionScale: false };
86
+ }
87
+ }
88
+ MapTypeToString(sourceType, sourceLength, sourcePrecision, sourceScale) {
89
+ const mapped = this.MapType(sourceType, sourceLength, sourcePrecision, sourceScale);
90
+ return formatTypeString(mapped, sourceLength, sourcePrecision, sourceScale);
91
+ }
92
+ mapNVarchar(length) {
93
+ if (length === -1 || length === undefined) {
94
+ return { typeName: 'TEXT', supportsLength: false, supportsPrecisionScale: false };
95
+ }
96
+ return { typeName: 'VARCHAR', supportsLength: true, supportsPrecisionScale: false, defaultLength: length };
97
+ }
98
+ mapVarchar(length) {
99
+ if (length === -1 || length === undefined) {
100
+ return { typeName: 'TEXT', supportsLength: false, supportsPrecisionScale: false };
101
+ }
102
+ return { typeName: 'VARCHAR', supportsLength: true, supportsPrecisionScale: false, defaultLength: length };
103
+ }
104
+ mapFloat(precision) {
105
+ // SQL Server FLOAT(1-24) = REAL, FLOAT(25-53) = DOUBLE PRECISION
106
+ if (precision != null && precision <= 24) {
107
+ return { typeName: 'REAL', supportsLength: false, supportsPrecisionScale: false };
108
+ }
109
+ return { typeName: 'DOUBLE PRECISION', supportsLength: false, supportsPrecisionScale: false };
110
+ }
111
+ }
112
+ /**
113
+ * Helper to format a MappedType into a full SQL type string.
114
+ */
115
+ function formatTypeString(mapped, length, precision, scale) {
116
+ if (mapped.supportsPrecisionScale && precision != null) {
117
+ return scale != null
118
+ ? `${mapped.typeName}(${precision},${scale})`
119
+ : `${mapped.typeName}(${precision})`;
120
+ }
121
+ if (mapped.supportsLength) {
122
+ const len = length ?? mapped.defaultLength;
123
+ if (len != null) {
124
+ return len === -1 ? 'TEXT' : `${mapped.typeName}(${len})`;
125
+ }
126
+ }
127
+ return mapped.typeName;
128
+ }
129
+ /**
130
+ * PostgreSQL dialect implementation.
131
+ * Uses "double-quote" identifiers, LIMIT/OFFSET pagination, native BOOLEAN, PL/pgSQL functions.
132
+ */
133
+ export class PostgreSQLDialect extends SQLDialect {
134
+ get PlatformKey() {
135
+ return 'postgresql';
136
+ }
137
+ // ─── Identifier Quoting ──────────────────────────────────────────
138
+ QuoteIdentifier(name) {
139
+ return `"${name}"`;
140
+ }
141
+ QuoteSchema(schema, object) {
142
+ return `${schema}."${object}"`;
143
+ }
144
+ // ─── Pagination ──────────────────────────────────────────────────
145
+ LimitClause(limit, offset) {
146
+ const parts = [`LIMIT ${limit}`];
147
+ if (offset != null) {
148
+ parts.push(`OFFSET ${offset}`);
149
+ }
150
+ return { prefix: '', suffix: parts.join(' ') };
151
+ }
152
+ // ─── Literals & Expressions ──────────────────────────────────────
153
+ BooleanLiteral(value) {
154
+ return value ? 'true' : 'false';
155
+ }
156
+ CurrentTimestampUTC() {
157
+ return "(NOW() AT TIME ZONE 'UTC')";
158
+ }
159
+ NewUUID() {
160
+ return 'gen_random_uuid()';
161
+ }
162
+ CastToText(expr) {
163
+ return `CAST(${expr} AS TEXT)`;
164
+ }
165
+ CastToUUID(expr) {
166
+ return `CAST(${expr} AS UUID)`;
167
+ }
168
+ // ─── INSERT/UPDATE Return Patterns ───────────────────────────────
169
+ ReturnInsertedClause(columns) {
170
+ if (columns && columns.length > 0) {
171
+ const cols = columns.map(c => `"${c}"`).join(', ');
172
+ return `RETURNING ${cols}`;
173
+ }
174
+ return 'RETURNING *';
175
+ }
176
+ AutoIncrementPKExpression() {
177
+ return 'GENERATED ALWAYS AS IDENTITY';
178
+ }
179
+ UUIDPKDefault() {
180
+ return 'gen_random_uuid()';
181
+ }
182
+ ScopeIdentityExpression() {
183
+ return 'lastval()';
184
+ }
185
+ RowCountExpression() {
186
+ // In PL/pgSQL, use GET DIAGNOSTICS row_count = ROW_COUNT
187
+ return 'ROW_COUNT';
188
+ }
189
+ // ─── Batch & DDL Control ─────────────────────────────────────────
190
+ BatchSeparator() {
191
+ return ''; // PostgreSQL does not need batch separators
192
+ }
193
+ ExistenceCheckSQL(objectType, schema, name) {
194
+ const normalizedType = objectType.toUpperCase();
195
+ switch (normalizedType) {
196
+ case 'TABLE':
197
+ return `SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_tables WHERE schemaname = '${schema}' AND tablename = '${name}')`;
198
+ case 'VIEW':
199
+ return `SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_views WHERE schemaname = '${schema}' AND viewname = '${name}')`;
200
+ case 'FUNCTION':
201
+ return `SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON p.pronamespace = n.oid WHERE n.nspname = '${schema}' AND p.proname = '${name}')`;
202
+ case 'PROCEDURE':
203
+ return `SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON p.pronamespace = n.oid WHERE n.nspname = '${schema}' AND p.proname = '${name}' AND p.prokind = 'p')`;
204
+ case 'TRIGGER':
205
+ return `SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_trigger WHERE tgname = '${name}')`;
206
+ default:
207
+ return `SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid WHERE n.nspname = '${schema}' AND c.relname = '${name}')`;
208
+ }
209
+ }
210
+ CreateOrReplaceSupported(objectType) {
211
+ const normalized = objectType.toUpperCase();
212
+ return normalized === 'FUNCTION' || normalized === 'VIEW' || normalized === 'PROCEDURE';
213
+ }
214
+ // ─── Full-Text Search ────────────────────────────────────────────
215
+ FullTextSearchPredicate(column, searchTerm) {
216
+ return `${column} @@ plainto_tsquery('english', ${searchTerm})`;
217
+ }
218
+ FullTextIndexDDL(table, columns, _catalog) {
219
+ const colList = columns.map(c => `"${c}"`).join(', ');
220
+ const cleanTable = table.replace(/"/g, '');
221
+ const triggerCols = columns.map(c => `"${c}"`).join(', ');
222
+ const lines = [];
223
+ // Add tsvector column
224
+ lines.push(`ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS __mj_fts_vector TSVECTOR;`);
225
+ lines.push('');
226
+ // Create GIN index on the tsvector column
227
+ lines.push(`CREATE INDEX IF NOT EXISTS idx_fts_${cleanTable.replace(/\./g, '_')} ON ${table} USING GIN(__mj_fts_vector);`);
228
+ lines.push('');
229
+ // Create update trigger
230
+ lines.push(`CREATE OR REPLACE FUNCTION ${this.extractSchema(table)}.fn_trg_fts_${this.extractName(table)}()`);
231
+ lines.push('RETURNS TRIGGER AS $$');
232
+ lines.push('BEGIN');
233
+ lines.push(` NEW.__mj_fts_vector := to_tsvector('english', ${columns.map(c => `COALESCE(NEW."${c}", '')`).join(" || ' ' || ")});`);
234
+ lines.push(' RETURN NEW;');
235
+ lines.push('END;');
236
+ lines.push('$$ LANGUAGE plpgsql;');
237
+ lines.push('');
238
+ lines.push(`DROP TRIGGER IF EXISTS trg_fts_${this.extractName(table)} ON ${table};`);
239
+ lines.push(`CREATE TRIGGER trg_fts_${this.extractName(table)}`);
240
+ lines.push(` BEFORE INSERT OR UPDATE ON ${table}`);
241
+ lines.push(` FOR EACH ROW EXECUTE FUNCTION ${this.extractSchema(table)}.fn_trg_fts_${this.extractName(table)}();`);
242
+ return lines.join('\n');
243
+ }
244
+ // ─── CTE / Recursion ─────────────────────────────────────────────
245
+ RecursiveCTESyntax() {
246
+ return 'WITH RECURSIVE';
247
+ }
248
+ // ─── Data Types ──────────────────────────────────────────────────
249
+ get TypeMap() {
250
+ return new PostgreSQLDataTypeMap();
251
+ }
252
+ // ─── Parameters ──────────────────────────────────────────────────
253
+ ParameterPlaceholder(index) {
254
+ return `$${index + 1}`; // PostgreSQL uses 1-based indexing
255
+ }
256
+ ConcatOperator() {
257
+ return '||';
258
+ }
259
+ // ─── String Functions ────────────────────────────────────────────
260
+ StringSplitFunction(value, delimiter) {
261
+ return `unnest(string_to_array(${value}, ${delimiter}))`;
262
+ }
263
+ JsonExtract(column, path) {
264
+ // PostgreSQL JSONB operator for text extraction
265
+ return `${column}->>'${path}'`;
266
+ }
267
+ // ─── Procedure / Function Calls ──────────────────────────────────
268
+ ProcedureCallSyntax(schema, name, params) {
269
+ const paramList = params.join(', ');
270
+ return `SELECT * FROM ${schema}."${name}"(${paramList})`;
271
+ }
272
+ // ─── DDL Generation ──────────────────────────────────────────────
273
+ TriggerDDL(options) {
274
+ const events = options.events.join(' OR ');
275
+ const forEach = options.forEach ?? 'ROW';
276
+ const funcName = options.functionName ?? `fn_${options.triggerName}`;
277
+ const lines = [];
278
+ // PostgreSQL triggers require a companion function
279
+ lines.push(`CREATE OR REPLACE FUNCTION ${options.schema}."${funcName}"()`);
280
+ lines.push('RETURNS TRIGGER AS $$');
281
+ lines.push('BEGIN');
282
+ lines.push(` ${options.body}`);
283
+ lines.push('END;');
284
+ lines.push('$$ LANGUAGE plpgsql;');
285
+ lines.push('');
286
+ lines.push(`DROP TRIGGER IF EXISTS "${options.triggerName}" ON ${options.schema}."${options.tableName}";`);
287
+ lines.push(`CREATE TRIGGER "${options.triggerName}"`);
288
+ lines.push(` ${options.timing} ${events} ON ${options.schema}."${options.tableName}"`);
289
+ lines.push(` FOR EACH ${forEach}`);
290
+ lines.push(` EXECUTE FUNCTION ${options.schema}."${funcName}"();`);
291
+ return lines.join('\n');
292
+ }
293
+ IndexDDL(options) {
294
+ const unique = options.unique ? 'UNIQUE ' : '';
295
+ const method = options.method ? ` USING ${options.method}` : '';
296
+ const cols = options.columns.map(c => `"${c}"`).join(', ');
297
+ let ddl = `CREATE ${unique}INDEX IF NOT EXISTS "${options.indexName}" ON ${options.schema}."${options.tableName}"${method}(${cols})`;
298
+ if (options.where) {
299
+ ddl += ` WHERE ${options.where}`;
300
+ }
301
+ return ddl;
302
+ }
303
+ // ─── Permissions ─────────────────────────────────────────────────
304
+ GrantPermission(permission, _objectType, schema, object, role) {
305
+ return `GRANT ${permission} ON ${schema}."${object}" TO "${role}"`;
306
+ }
307
+ CommentOnObject(objectType, schema, name, comment) {
308
+ const escapedComment = comment.replace(/'/g, "''");
309
+ const normalizedType = objectType.toUpperCase();
310
+ return `COMMENT ON ${normalizedType} ${schema}."${name}" IS '${escapedComment}'`;
311
+ }
312
+ // ─── Schema Introspection ────────────────────────────────────────
313
+ SchemaIntrospectionQueries() {
314
+ return {
315
+ listTables: `
316
+ SELECT schemaname AS schema_name, tablename AS table_name
317
+ FROM pg_catalog.pg_tables
318
+ WHERE schemaname = $1
319
+ ORDER BY tablename`,
320
+ listColumns: `
321
+ SELECT c.column_name, c.data_type, c.character_maximum_length AS max_length,
322
+ c.numeric_precision AS precision, c.numeric_scale AS scale,
323
+ c.is_nullable, c.column_default AS default_value,
324
+ CASE WHEN c.column_default LIKE '%nextval%' THEN true ELSE false END AS is_identity
325
+ FROM information_schema.columns c
326
+ WHERE c.table_schema = $1 AND c.table_name = $2
327
+ ORDER BY c.ordinal_position`,
328
+ listConstraints: `
329
+ SELECT tc.constraint_name, tc.constraint_type, kcu.column_name
330
+ FROM information_schema.table_constraints tc
331
+ JOIN information_schema.key_column_usage kcu
332
+ ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
333
+ WHERE tc.table_schema = $1 AND tc.table_name = $2
334
+ ORDER BY tc.constraint_type, kcu.ordinal_position`,
335
+ listForeignKeys: `
336
+ SELECT
337
+ tc.constraint_name AS fk_name,
338
+ tc.table_schema AS source_schema,
339
+ tc.table_name AS source_table,
340
+ kcu.column_name AS source_column,
341
+ ccu.table_schema AS target_schema,
342
+ ccu.table_name AS target_table,
343
+ ccu.column_name AS target_column
344
+ FROM information_schema.table_constraints tc
345
+ JOIN information_schema.key_column_usage kcu
346
+ ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
347
+ JOIN information_schema.constraint_column_usage ccu
348
+ ON tc.constraint_name = ccu.constraint_name AND tc.table_schema = ccu.table_schema
349
+ WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = $1
350
+ ORDER BY tc.constraint_name`,
351
+ listIndexes: `
352
+ SELECT
353
+ i.relname AS index_name,
354
+ ix.indisunique AS is_unique,
355
+ am.amname AS type_desc,
356
+ a.attname AS column_name,
357
+ false AS is_included_column
358
+ FROM pg_catalog.pg_index ix
359
+ JOIN pg_catalog.pg_class t ON t.oid = ix.indrelid
360
+ JOIN pg_catalog.pg_class i ON i.oid = ix.indexrelid
361
+ JOIN pg_catalog.pg_namespace n ON n.oid = t.relnamespace
362
+ JOIN pg_catalog.pg_am am ON am.oid = i.relam
363
+ JOIN pg_catalog.pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)
364
+ WHERE n.nspname = $1 AND t.relname = $2
365
+ ORDER BY i.relname`,
366
+ objectExists: `
367
+ SELECT EXISTS (
368
+ SELECT 1 FROM pg_catalog.pg_class c
369
+ JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid
370
+ WHERE n.nspname = $1 AND c.relname = $2
371
+ ) AS exists`,
372
+ };
373
+ }
374
+ // ─── IIF ─────────────────────────────────────────────────────────
375
+ IIF(condition, trueVal, falseVal) {
376
+ return `CASE WHEN ${condition} THEN ${trueVal} ELSE ${falseVal} END`;
377
+ }
378
+ // ─── Private Helpers ─────────────────────────────────────────────
379
+ extractSchema(qualifiedName) {
380
+ const dotIndex = qualifiedName.indexOf('.');
381
+ if (dotIndex === -1)
382
+ return 'public';
383
+ return qualifiedName.substring(0, dotIndex).replace(/"/g, '');
384
+ }
385
+ extractName(qualifiedName) {
386
+ const dotIndex = qualifiedName.indexOf('.');
387
+ if (dotIndex === -1)
388
+ return qualifiedName.replace(/"/g, '');
389
+ return qualifiedName.substring(dotIndex + 1).replace(/"/g, '');
390
+ }
391
+ }
392
+ //# sourceMappingURL=postgresqlDialect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresqlDialect.js","sourceRoot":"","sources":["../src/postgresqlDialect.ts"],"names":[],"mappings":"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"}