@memberjunction/sql-dialect 6.1.0-edge.3 → 6.1.0-edge.4
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/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/postgresqlRestarLayeredOuter.d.ts +40 -0
- package/dist/postgresqlRestarLayeredOuter.d.ts.map +1 -0
- package/dist/postgresqlRestarLayeredOuter.js +253 -0
- package/dist/postgresqlRestarLayeredOuter.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export type { SchemaFieldType } from './sqlDialect.js';
|
|
|
5
5
|
export { SQLServerDialect } from './sqlServerDialect.js';
|
|
6
6
|
export { PostgreSQLDialect } from './postgresqlDialect.js';
|
|
7
7
|
export { GetDialect } from './dialectFactory.js';
|
|
8
|
+
export { restarLayeredOuterView, buildCreateOrReplaceLayeredOuterViewSQL, LayeredOuterRestarError, findTopLevelKeyword, splitTopLevelCommaList, } from './postgresqlRestarLayeredOuter.js';
|
|
9
|
+
export type { RestarLayeredOuterViewArgs } from './postgresqlRestarLayeredOuter.js';
|
|
8
10
|
export { AutoQuotePostgreSQLIdentifiers, PostgreSQLQuotingKeywords, PostgreSQLStructuralKeywords, PostgreSQLContextualStructuralKeywords, } from './postgresqlAutoQuote.js';
|
|
9
11
|
export { IsBooleanSQLType, IsStringSQLType, IsFixedWidthStringSQLType, IsDateSQLType, IsIntegerSQLType, IsFloatSQLType, IsUuidSQLType, IsBinarySQLType, IsJsonSQLType, IsCurrencySQLType, IsIntervalSQLType, IsNetworkSQLType, IsNumericSQLType, } from './typeClassification.js';
|
|
10
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EACH,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACrB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EACH,8BAA8B,EAC9B,yBAAyB,EACzB,4BAA4B,EAC5B,sCAAsC,GACzC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACH,gBAAgB,EAChB,eAAe,EACf,yBAAyB,EACzB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GACnB,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EACH,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACrB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EACH,sBAAsB,EACtB,uCAAuC,EACvC,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,GACzB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EACH,8BAA8B,EAC9B,yBAAyB,EACzB,4BAA4B,EAC5B,sCAAsC,GACzC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACH,gBAAgB,EAChB,eAAe,EACf,yBAAyB,EACzB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GACnB,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@ export { SQLDialect, } from './sqlDialect.js';
|
|
|
2
2
|
export { SQLServerDialect } from './sqlServerDialect.js';
|
|
3
3
|
export { PostgreSQLDialect } from './postgresqlDialect.js';
|
|
4
4
|
export { GetDialect } from './dialectFactory.js';
|
|
5
|
+
export { restarLayeredOuterView, buildCreateOrReplaceLayeredOuterViewSQL, LayeredOuterRestarError, findTopLevelKeyword, splitTopLevelCommaList, } from './postgresqlRestarLayeredOuter.js';
|
|
5
6
|
export { AutoQuotePostgreSQLIdentifiers, PostgreSQLQuotingKeywords, PostgreSQLStructuralKeywords, PostgreSQLContextualStructuralKeywords, } from './postgresqlAutoQuote.js';
|
|
6
7
|
export { IsBooleanSQLType, IsStringSQLType, IsFixedWidthStringSQLType, IsDateSQLType, IsIntegerSQLType, IsFloatSQLType, IsUuidSQLType, IsBinarySQLType, IsJsonSQLType, IsCurrencySQLType, IsIntervalSQLType, IsNetworkSQLType, IsNumericSQLType, } from './typeClassification.js';
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACH,UAAU,GASb,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EACH,8BAA8B,EAC9B,yBAAyB,EACzB,4BAA4B,EAC5B,sCAAsC,GACzC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACH,gBAAgB,EAChB,eAAe,EACf,yBAAyB,EACzB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GACnB,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACH,UAAU,GASb,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EACH,sBAAsB,EACtB,uCAAuC,EACvC,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,GACzB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EACH,8BAA8B,EAC9B,yBAAyB,EACzB,4BAA4B,EAC5B,sCAAsC,GACzC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACH,gBAAgB,EAChB,eAAe,EACf,yBAAyB,EACzB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GACnB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rebuild a PostgreSQL layered outer view so `g.*` re-expands against the
|
|
3
|
+
* current inner view.
|
|
4
|
+
*
|
|
5
|
+
* PostgreSQL expands `SELECT *` / `g.*` at CREATE VIEW time and freezes the
|
|
6
|
+
* column list. `CREATE OR REPLACE` of the inner view does not touch dependents,
|
|
7
|
+
* so a wrapper written as `SELECT g.*, extras FROM inner g` silently stops
|
|
8
|
+
* picking up new inner columns. `pg_get_viewdef` returns that *expanded* list,
|
|
9
|
+
* not the original `g.*`.
|
|
10
|
+
*
|
|
11
|
+
* This rewrites the deparsed outer definition back to `SELECT <alias>.*, extras`
|
|
12
|
+
* so CREATE VIEW re-expands against the live inner relation. Extra SELECT items
|
|
13
|
+
* (computed columns, joins) are preserved. Inner columns newly added in the
|
|
14
|
+
* *middle* of `g.*` are not in the old deparsed list; putting `g.*` back is
|
|
15
|
+
* what makes them appear.
|
|
16
|
+
*
|
|
17
|
+
* The extras-are-trailing contract is the layered-view one: `g.*` then
|
|
18
|
+
* application columns. We consume leading SELECT items that are simple
|
|
19
|
+
* references to inner-view columns, and treat the rest as extras.
|
|
20
|
+
*/
|
|
21
|
+
export declare class LayeredOuterRestarError extends Error {
|
|
22
|
+
constructor(message: string);
|
|
23
|
+
}
|
|
24
|
+
export interface RestarLayeredOuterViewArgs {
|
|
25
|
+
/** Body returned by `pg_get_viewdef(oid, true)` — a SELECT, not CREATE VIEW. */
|
|
26
|
+
viewDefinition: string;
|
|
27
|
+
/** Unquoted inner view name, e.g. `vwOrganizationsGenerated`. */
|
|
28
|
+
innerViewName: string;
|
|
29
|
+
/** Inner view column names in ordinal order (unquoted). */
|
|
30
|
+
innerColumns: string[];
|
|
31
|
+
}
|
|
32
|
+
export declare function restarLayeredOuterView(args: RestarLayeredOuterViewArgs): string;
|
|
33
|
+
export declare function buildCreateOrReplaceLayeredOuterViewSQL(schema: string, outerView: string, restarredSelect: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Index of a top-level SQL keyword (FROM, etc.) in `sql`, ignoring matches
|
|
36
|
+
* inside parentheses or quoted identifiers/strings.
|
|
37
|
+
*/
|
|
38
|
+
export declare function findTopLevelKeyword(sql: string, keyword: string): number;
|
|
39
|
+
export declare function splitTopLevelCommaList(list: string): string[];
|
|
40
|
+
//# sourceMappingURL=postgresqlRestarLayeredOuter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresqlRestarLayeredOuter.d.ts","sourceRoot":"","sources":["../src/postgresqlRestarLayeredOuter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,qBAAa,uBAAwB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI9B;AAED,MAAM,WAAW,0BAA0B;IACvC,gFAAgF;IAChF,cAAc,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,YAAY,EAAE,MAAM,EAAE,CAAC;CAC1B;AAID,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,0BAA0B,GAAG,MAAM,CAgD/E;AAED,wBAAgB,uCAAuC,CACnD,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GACxB,MAAM,CAER;AAmBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA+BxE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAgC7D"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rebuild a PostgreSQL layered outer view so `g.*` re-expands against the
|
|
3
|
+
* current inner view.
|
|
4
|
+
*
|
|
5
|
+
* PostgreSQL expands `SELECT *` / `g.*` at CREATE VIEW time and freezes the
|
|
6
|
+
* column list. `CREATE OR REPLACE` of the inner view does not touch dependents,
|
|
7
|
+
* so a wrapper written as `SELECT g.*, extras FROM inner g` silently stops
|
|
8
|
+
* picking up new inner columns. `pg_get_viewdef` returns that *expanded* list,
|
|
9
|
+
* not the original `g.*`.
|
|
10
|
+
*
|
|
11
|
+
* This rewrites the deparsed outer definition back to `SELECT <alias>.*, extras`
|
|
12
|
+
* so CREATE VIEW re-expands against the live inner relation. Extra SELECT items
|
|
13
|
+
* (computed columns, joins) are preserved. Inner columns newly added in the
|
|
14
|
+
* *middle* of `g.*` are not in the old deparsed list; putting `g.*` back is
|
|
15
|
+
* what makes them appear.
|
|
16
|
+
*
|
|
17
|
+
* The extras-are-trailing contract is the layered-view one: `g.*` then
|
|
18
|
+
* application columns. We consume leading SELECT items that are simple
|
|
19
|
+
* references to inner-view columns, and treat the rest as extras.
|
|
20
|
+
*/
|
|
21
|
+
export class LayeredOuterRestarError extends Error {
|
|
22
|
+
constructor(message) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.name = 'LayeredOuterRestarError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const IDENT = String.raw `(?:"[^"]+"|[A-Za-z_][A-Za-z0-9_$]*)`;
|
|
28
|
+
export function restarLayeredOuterView(args) {
|
|
29
|
+
const innerCols = new Set(args.innerColumns.map((c) => c));
|
|
30
|
+
if (innerCols.size === 0) {
|
|
31
|
+
throw new LayeredOuterRestarError('innerColumns is empty; cannot restar a layered outer view');
|
|
32
|
+
}
|
|
33
|
+
let def = args.viewDefinition.trim();
|
|
34
|
+
if (def.endsWith(';')) {
|
|
35
|
+
def = def.slice(0, -1).trim();
|
|
36
|
+
}
|
|
37
|
+
if (!/^select\b/i.test(def)) {
|
|
38
|
+
throw new LayeredOuterRestarError(`outer view definition does not start with SELECT: ${def.slice(0, 80)}`);
|
|
39
|
+
}
|
|
40
|
+
const fromPos = findTopLevelKeyword(def, 'from');
|
|
41
|
+
if (fromPos < 0) {
|
|
42
|
+
throw new LayeredOuterRestarError('outer view definition has no top-level FROM');
|
|
43
|
+
}
|
|
44
|
+
const selectList = def.slice('select'.length, fromPos).trim();
|
|
45
|
+
const fromAndRest = def.slice(fromPos).trim();
|
|
46
|
+
const alias = detectInnerAlias(fromAndRest, args.innerViewName) ?? 'g';
|
|
47
|
+
const items = splitTopLevelCommaList(selectList);
|
|
48
|
+
if (items.length === 0) {
|
|
49
|
+
throw new LayeredOuterRestarError('outer view SELECT list is empty');
|
|
50
|
+
}
|
|
51
|
+
if (isStarOfAlias(items[0], alias) || isBareStar(items[0])) {
|
|
52
|
+
const extras = items.slice(1);
|
|
53
|
+
return rebuildSelect(alias, extras, fromAndRest);
|
|
54
|
+
}
|
|
55
|
+
let consumed = 0;
|
|
56
|
+
for (const item of items) {
|
|
57
|
+
if (isSimpleInnerColumnRef(item, alias, innerCols)) {
|
|
58
|
+
consumed++;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (consumed === 0) {
|
|
65
|
+
throw new LayeredOuterRestarError(`outer view SELECT list does not start with inner columns of ${args.innerViewName} (first item: ${items[0].slice(0, 80)})`);
|
|
66
|
+
}
|
|
67
|
+
return rebuildSelect(alias, items.slice(consumed), fromAndRest);
|
|
68
|
+
}
|
|
69
|
+
export function buildCreateOrReplaceLayeredOuterViewSQL(schema, outerView, restarredSelect) {
|
|
70
|
+
return `CREATE OR REPLACE VIEW ${quoteQualified(schema, outerView)}\nAS\n${restarredSelect}`;
|
|
71
|
+
}
|
|
72
|
+
function rebuildSelect(alias, extras, fromAndRest) {
|
|
73
|
+
const star = `SELECT ${quoteIdent(alias)}.*`;
|
|
74
|
+
if (extras.length === 0) {
|
|
75
|
+
return `${star}\n${fromAndRest}`;
|
|
76
|
+
}
|
|
77
|
+
const extraList = extras.map((e) => e.trim()).join(',\n ');
|
|
78
|
+
return `${star},\n ${extraList}\n${fromAndRest}`;
|
|
79
|
+
}
|
|
80
|
+
function quoteIdent(name) {
|
|
81
|
+
return `"${name.replace(/"/g, '""')}"`;
|
|
82
|
+
}
|
|
83
|
+
function quoteQualified(schema, name) {
|
|
84
|
+
return `${quoteIdent(schema)}.${quoteIdent(name)}`;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Index of a top-level SQL keyword (FROM, etc.) in `sql`, ignoring matches
|
|
88
|
+
* inside parentheses or quoted identifiers/strings.
|
|
89
|
+
*/
|
|
90
|
+
export function findTopLevelKeyword(sql, keyword) {
|
|
91
|
+
const target = keyword.toLowerCase();
|
|
92
|
+
let depth = 0;
|
|
93
|
+
let i = 0;
|
|
94
|
+
while (i < sql.length) {
|
|
95
|
+
const ch = sql[i];
|
|
96
|
+
if (ch === "'" || ch === '"') {
|
|
97
|
+
i = skipQuoted(sql, i, ch);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (ch === '(') {
|
|
101
|
+
depth++;
|
|
102
|
+
i++;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (ch === ')') {
|
|
106
|
+
depth--;
|
|
107
|
+
i++;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (depth === 0 &&
|
|
111
|
+
isKeywordStart(sql, i) &&
|
|
112
|
+
sql.slice(i, i + target.length).toLowerCase() === target &&
|
|
113
|
+
isKeywordEnd(sql, i + target.length)) {
|
|
114
|
+
return i;
|
|
115
|
+
}
|
|
116
|
+
i++;
|
|
117
|
+
}
|
|
118
|
+
return -1;
|
|
119
|
+
}
|
|
120
|
+
export function splitTopLevelCommaList(list) {
|
|
121
|
+
const items = [];
|
|
122
|
+
let depth = 0;
|
|
123
|
+
let start = 0;
|
|
124
|
+
let i = 0;
|
|
125
|
+
while (i < list.length) {
|
|
126
|
+
const ch = list[i];
|
|
127
|
+
if (ch === "'" || ch === '"') {
|
|
128
|
+
i = skipQuoted(list, i, ch);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (ch === '(') {
|
|
132
|
+
depth++;
|
|
133
|
+
i++;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (ch === ')') {
|
|
137
|
+
depth--;
|
|
138
|
+
i++;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (ch === ',' && depth === 0) {
|
|
142
|
+
items.push(list.slice(start, i).trim());
|
|
143
|
+
start = i + 1;
|
|
144
|
+
}
|
|
145
|
+
i++;
|
|
146
|
+
}
|
|
147
|
+
const last = list.slice(start).trim();
|
|
148
|
+
if (last) {
|
|
149
|
+
items.push(last);
|
|
150
|
+
}
|
|
151
|
+
return items;
|
|
152
|
+
}
|
|
153
|
+
function skipQuoted(sql, start, quote) {
|
|
154
|
+
let i = start + 1;
|
|
155
|
+
while (i < sql.length) {
|
|
156
|
+
if (sql[i] === quote) {
|
|
157
|
+
if (sql[i + 1] === quote) {
|
|
158
|
+
i += 2;
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
return i + 1;
|
|
162
|
+
}
|
|
163
|
+
i++;
|
|
164
|
+
}
|
|
165
|
+
return sql.length;
|
|
166
|
+
}
|
|
167
|
+
function isKeywordStart(sql, index) {
|
|
168
|
+
if (index === 0) {
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
return !/[A-Za-z0-9_$]/.test(sql[index - 1]);
|
|
172
|
+
}
|
|
173
|
+
function isKeywordEnd(sql, index) {
|
|
174
|
+
if (index >= sql.length) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
return !/[A-Za-z0-9_$]/.test(sql[index]);
|
|
178
|
+
}
|
|
179
|
+
function detectInnerAlias(fromAndRest, innerViewName) {
|
|
180
|
+
const fromMatch = fromAndRest.match(new RegExp(String.raw `^from\s+(${IDENT}(?:\.${IDENT})?)(?:\s+as)?\s+(${IDENT})\b`, 'i'));
|
|
181
|
+
if (!fromMatch) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
const relation = unquoteIdent(fromMatch[1].includes('.') ? fromMatch[1].slice(fromMatch[1].lastIndexOf('.') + 1) : fromMatch[1]);
|
|
185
|
+
if (relation !== innerViewName) {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
return unquoteIdent(fromMatch[2]);
|
|
189
|
+
}
|
|
190
|
+
function unquoteIdent(raw) {
|
|
191
|
+
const trimmed = raw.trim();
|
|
192
|
+
if (trimmed.startsWith('"') && trimmed.endsWith('"')) {
|
|
193
|
+
return trimmed.slice(1, -1).replace(/""/g, '"');
|
|
194
|
+
}
|
|
195
|
+
return trimmed;
|
|
196
|
+
}
|
|
197
|
+
function isBareStar(item) {
|
|
198
|
+
return item.trim() === '*';
|
|
199
|
+
}
|
|
200
|
+
function isStarOfAlias(item, alias) {
|
|
201
|
+
const t = item.trim();
|
|
202
|
+
const aliasQ = quoteIdent(alias);
|
|
203
|
+
return new RegExp(String.raw `^(?:${escapeRegExp(aliasQ)}|${escapeRegExp(alias)})\.\*$`, 'i').test(t);
|
|
204
|
+
}
|
|
205
|
+
function isSimpleInnerColumnRef(item, alias, innerCols) {
|
|
206
|
+
let t = item.trim();
|
|
207
|
+
t = t.replace(/\s*::[\w\s."()]+$/i, '').trim();
|
|
208
|
+
t = stripWrappingParens(t);
|
|
209
|
+
const asMatch = t.match(new RegExp(String.raw `^(.*)\s+as\s+(${IDENT})$`, 'i'));
|
|
210
|
+
let asName = null;
|
|
211
|
+
if (asMatch) {
|
|
212
|
+
t = asMatch[1].trim();
|
|
213
|
+
asName = unquoteIdent(asMatch[2]);
|
|
214
|
+
}
|
|
215
|
+
const colMatch = t.match(new RegExp(String.raw `^(?:(${IDENT})\.)?(${IDENT})$`));
|
|
216
|
+
if (!colMatch) {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
if (colMatch[1] && unquoteIdent(colMatch[1]) !== alias) {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
const col = unquoteIdent(colMatch[2]);
|
|
223
|
+
if (asName && asName !== col) {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
return innerCols.has(col);
|
|
227
|
+
}
|
|
228
|
+
function stripWrappingParens(s) {
|
|
229
|
+
let t = s;
|
|
230
|
+
while (t.startsWith('(') && t.endsWith(')')) {
|
|
231
|
+
let depth = 0;
|
|
232
|
+
let wraps = true;
|
|
233
|
+
for (let i = 0; i < t.length; i++) {
|
|
234
|
+
if (t[i] === '(')
|
|
235
|
+
depth++;
|
|
236
|
+
else if (t[i] === ')')
|
|
237
|
+
depth--;
|
|
238
|
+
if (depth === 0 && i < t.length - 1) {
|
|
239
|
+
wraps = false;
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (!wraps) {
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
t = t.slice(1, -1).trim();
|
|
247
|
+
}
|
|
248
|
+
return t;
|
|
249
|
+
}
|
|
250
|
+
function escapeRegExp(s) {
|
|
251
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=postgresqlRestarLayeredOuter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresqlRestarLayeredOuter.js","sourceRoot":"","sources":["../src/postgresqlRestarLayeredOuter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@memberjunction/sql-dialect",
|
|
3
3
|
"license": "BUSL-1.1",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "6.1.0-edge.
|
|
5
|
+
"version": "6.1.0-edge.4",
|
|
6
6
|
"description": "MemberJunction: SQL Dialect Abstraction Layer for multi-database support",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"types": "dist/index.d.ts",
|