@deepagents/text2sql 6.1.2 → 7.0.1
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/README.md +16 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/lib/adapters/bigquery/index.js +87 -7
- package/dist/lib/adapters/bigquery/index.js.map +3 -3
- package/dist/lib/adapters/clickhouse/index.js +1 -1
- package/dist/lib/adapters/clickhouse/index.js.map +2 -2
- package/dist/lib/adapters/duckdb/duckdb-identifiers.d.ts +8 -0
- package/dist/lib/adapters/duckdb/duckdb-identifiers.d.ts.map +1 -0
- package/dist/lib/adapters/duckdb/duckdb.d.ts +40 -0
- package/dist/lib/adapters/duckdb/duckdb.d.ts.map +1 -0
- package/dist/lib/adapters/duckdb/duckdb.groundings.d.ts +58 -0
- package/dist/lib/adapters/duckdb/duckdb.groundings.d.ts.map +1 -0
- package/dist/lib/adapters/duckdb/duckdb.sql-policy.d.ts +8 -0
- package/dist/lib/adapters/duckdb/duckdb.sql-policy.d.ts.map +1 -0
- package/dist/lib/adapters/duckdb/index.d.ts +34 -0
- package/dist/lib/adapters/duckdb/index.d.ts.map +1 -0
- package/dist/lib/adapters/duckdb/index.js +1933 -0
- package/dist/lib/adapters/duckdb/index.js.map +7 -0
- package/dist/lib/adapters/mysql/index.js +87 -7
- package/dist/lib/adapters/mysql/index.js.map +3 -3
- package/dist/lib/adapters/parser-sql-policy.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/index.js +87 -7
- package/dist/lib/adapters/postgres/index.js.map +3 -3
- package/dist/lib/adapters/postgres/postgres-parser-workaround.d.ts +8 -0
- package/dist/lib/adapters/postgres/postgres-parser-workaround.d.ts.map +1 -0
- package/dist/lib/adapters/posthog/index.js +1 -1
- package/dist/lib/adapters/posthog/index.js.map +2 -2
- package/dist/lib/adapters/spreadsheet/index.js +87 -7
- package/dist/lib/adapters/spreadsheet/index.js.map +3 -3
- package/dist/lib/adapters/sqlite/index.js +87 -7
- package/dist/lib/adapters/sqlite/index.js.map +3 -3
- package/dist/lib/adapters/sqlserver/index.js +87 -7
- package/dist/lib/adapters/sqlserver/index.js.map +3 -3
- package/dist/lib/agents/question.agent.d.ts.map +1 -1
- package/dist/lib/synthesis/extractors/base-contextual-extractor.d.ts.map +1 -1
- package/dist/lib/synthesis/index.js.map +2 -2
- package/package.json +18 -19
|
@@ -398,7 +398,7 @@ var Adapter = class {
|
|
|
398
398
|
}
|
|
399
399
|
}
|
|
400
400
|
#decodeShellEscapes(sql) {
|
|
401
|
-
return sql.replace(/\\n/g, "\n").replace(/\\t/g, " ").replace(/\\([()
|
|
401
|
+
return sql.replace(/\\n/g, "\n").replace(/\\t/g, " ").replace(/\\([().*$])/g, "$1").replace(/\\(?=$)/gm, "");
|
|
402
402
|
}
|
|
403
403
|
#cachedAllowedEntities = null;
|
|
404
404
|
async #resolveScope() {
|
|
@@ -1408,6 +1408,71 @@ function buildScopeParseErrorPayload(sql, parserDialect, error) {
|
|
|
1408
1408
|
};
|
|
1409
1409
|
}
|
|
1410
1410
|
|
|
1411
|
+
// packages/text2sql/src/lib/adapters/postgres/postgres-parser-workaround.ts
|
|
1412
|
+
var TYPE_BEFORE_LITERAL = /(?<type>(?:pg_catalog\.)?[A-Za-z_][A-Za-z0-9_$]*(?:\s+(?:varying|precision))?(?:\s*\(\s*\d+(?:\s*,\s*\d+)?\s*\))?(?:\s+(?:with|without)\s+time\s+zone)?)\s*$/i;
|
|
1413
|
+
var TIME_ZONE_SUFFIX = /^\s+time\s+zone\s+/i;
|
|
1414
|
+
var TIME_BEFORE_SUFFIX = /(?<type>time(?:stamp)?(?:\s*\(\s*\d+\s*\))?)\s+(?<qualifier>with|without)$/i;
|
|
1415
|
+
function recoverPostgresTypedLiteralParserGap(sql, error) {
|
|
1416
|
+
const errorOffset = parserErrorOffset(error);
|
|
1417
|
+
if (errorOffset === null) return null;
|
|
1418
|
+
const prefix = sql.slice(0, errorOffset);
|
|
1419
|
+
let literalStart = errorOffset;
|
|
1420
|
+
let literalEnd = findLiteralEnd(sql, literalStart);
|
|
1421
|
+
let typeMatch = TYPE_BEFORE_LITERAL.exec(prefix);
|
|
1422
|
+
let type = typeMatch?.groups?.type;
|
|
1423
|
+
if (literalEnd === null) {
|
|
1424
|
+
const suffixMatch = TIME_ZONE_SUFFIX.exec(sql.slice(errorOffset));
|
|
1425
|
+
typeMatch = TIME_BEFORE_SUFFIX.exec(prefix);
|
|
1426
|
+
type = typeMatch?.groups?.type && typeMatch.groups.qualifier && suffixMatch ? `${typeMatch.groups.type} ${typeMatch.groups.qualifier} TIME ZONE` : void 0;
|
|
1427
|
+
literalStart = errorOffset + (suffixMatch?.[0].length ?? 0);
|
|
1428
|
+
literalEnd = findLiteralEnd(sql, literalStart);
|
|
1429
|
+
}
|
|
1430
|
+
if (!type || typeMatch?.index === void 0 || literalEnd === null)
|
|
1431
|
+
return null;
|
|
1432
|
+
return prefix.slice(0, typeMatch.index) + `CAST(${sql.slice(literalStart, literalEnd)} AS ${parserType(type)})` + sql.slice(literalEnd);
|
|
1433
|
+
}
|
|
1434
|
+
function parserErrorOffset(error) {
|
|
1435
|
+
if (typeof error !== "object" || error === null) return null;
|
|
1436
|
+
const location = Reflect.get(error, "location");
|
|
1437
|
+
if (typeof location !== "object" || location === null) return null;
|
|
1438
|
+
const start = Reflect.get(location, "start");
|
|
1439
|
+
if (typeof start !== "object" || start === null) return null;
|
|
1440
|
+
const offset = Reflect.get(start, "offset");
|
|
1441
|
+
return typeof offset === "number" ? offset : null;
|
|
1442
|
+
}
|
|
1443
|
+
function findLiteralEnd(sql, start) {
|
|
1444
|
+
if (sql[start] !== "'") {
|
|
1445
|
+
const delimiter = /^\$(?:[A-Za-z_][A-Za-z0-9_]*)?\$/.exec(
|
|
1446
|
+
sql.slice(start)
|
|
1447
|
+
)?.[0];
|
|
1448
|
+
if (!delimiter) return null;
|
|
1449
|
+
const end = sql.indexOf(delimiter, start + delimiter.length);
|
|
1450
|
+
return end === -1 ? null : end + delimiter.length;
|
|
1451
|
+
}
|
|
1452
|
+
let offset = start + 1;
|
|
1453
|
+
while (offset < sql.length) {
|
|
1454
|
+
if (sql[offset] === "\\") {
|
|
1455
|
+
offset += 2;
|
|
1456
|
+
continue;
|
|
1457
|
+
}
|
|
1458
|
+
if (sql[offset] !== "'") {
|
|
1459
|
+
offset++;
|
|
1460
|
+
continue;
|
|
1461
|
+
}
|
|
1462
|
+
if (sql[offset + 1] === "'") {
|
|
1463
|
+
offset += 2;
|
|
1464
|
+
continue;
|
|
1465
|
+
}
|
|
1466
|
+
return offset + 1;
|
|
1467
|
+
}
|
|
1468
|
+
return null;
|
|
1469
|
+
}
|
|
1470
|
+
function parserType(type) {
|
|
1471
|
+
const unqualified = type.replace(/^pg_catalog\./i, "");
|
|
1472
|
+
const timetz = /^timetz(\s*\([^)]*\))?$/i.exec(unqualified);
|
|
1473
|
+
return timetz ? `TIME${timetz[1] ?? ""} WITH TIME ZONE` : unqualified;
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1411
1476
|
// packages/text2sql/src/lib/adapters/parser-sql-policy.ts
|
|
1412
1477
|
var READ_ONLY_MESSAGE = "only SELECT or WITH queries allowed";
|
|
1413
1478
|
var { Parser } = nodeSqlParser;
|
|
@@ -1432,7 +1497,7 @@ var ParserSqlPolicyAnalyzer = class {
|
|
|
1432
1497
|
#readParsedStatements(sql) {
|
|
1433
1498
|
for (const dialect of this.dialects) {
|
|
1434
1499
|
try {
|
|
1435
|
-
return parseStatements(sql, dialect);
|
|
1500
|
+
return this.#parseStatements(sql, dialect);
|
|
1436
1501
|
} catch {
|
|
1437
1502
|
}
|
|
1438
1503
|
}
|
|
@@ -1444,7 +1509,7 @@ var ParserSqlPolicyAnalyzer = class {
|
|
|
1444
1509
|
let lastDialect = this.dialects[0];
|
|
1445
1510
|
for (const dialect of this.dialects) {
|
|
1446
1511
|
try {
|
|
1447
|
-
references = extractBaseEntityReferences(sql, dialect);
|
|
1512
|
+
references = extractBaseEntityReferences(this.#parseAst(sql, dialect));
|
|
1448
1513
|
break;
|
|
1449
1514
|
} catch (error) {
|
|
1450
1515
|
lastDialect = dialect;
|
|
@@ -1479,9 +1544,25 @@ var ParserSqlPolicyAnalyzer = class {
|
|
|
1479
1544
|
});
|
|
1480
1545
|
return outOfScope.length === 0 ? null : buildOutOfScopePayload(sql, outOfScope, [...allowedEntities]);
|
|
1481
1546
|
}
|
|
1547
|
+
#parseStatements(sql, dialect) {
|
|
1548
|
+
return parseStatements(this.#parseAst(sql, dialect));
|
|
1549
|
+
}
|
|
1550
|
+
#parseAst(sql, dialect) {
|
|
1551
|
+
let parserSql = sql;
|
|
1552
|
+
const attempted = /* @__PURE__ */ new Set([sql]);
|
|
1553
|
+
while (true) {
|
|
1554
|
+
try {
|
|
1555
|
+
return parser.astify(parserSql, { database: dialect });
|
|
1556
|
+
} catch (error) {
|
|
1557
|
+
const recovered = dialect === "postgresql" ? recoverPostgresTypedLiteralParserGap(parserSql, error) : null;
|
|
1558
|
+
if (!recovered || attempted.has(recovered)) throw error;
|
|
1559
|
+
attempted.add(recovered);
|
|
1560
|
+
parserSql = recovered;
|
|
1561
|
+
}
|
|
1562
|
+
}
|
|
1563
|
+
}
|
|
1482
1564
|
};
|
|
1483
|
-
function parseStatements(
|
|
1484
|
-
const ast = parser.astify(sql, { database: dialect });
|
|
1565
|
+
function parseStatements(ast) {
|
|
1485
1566
|
const statements = Array.isArray(ast) ? ast : [ast];
|
|
1486
1567
|
return statements.filter(isAstLike);
|
|
1487
1568
|
}
|
|
@@ -1538,8 +1619,7 @@ function appendIdentifierParts(parts, value) {
|
|
|
1538
1619
|
...value.toLowerCase().split(".").filter((part) => part.length > 0)
|
|
1539
1620
|
);
|
|
1540
1621
|
}
|
|
1541
|
-
function extractBaseEntityReferences(
|
|
1542
|
-
const ast = parser.astify(sql, { database: dialect });
|
|
1622
|
+
function extractBaseEntityReferences(ast) {
|
|
1543
1623
|
const state = {
|
|
1544
1624
|
cteNames: /* @__PURE__ */ new Set(),
|
|
1545
1625
|
references: /* @__PURE__ */ new Map()
|