@deepagents/text2sql 6.1.2 → 7.0.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/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() {
|
|
@@ -1323,6 +1323,71 @@ function buildScopeParseErrorPayload(sql, parserDialect, error) {
|
|
|
1323
1323
|
};
|
|
1324
1324
|
}
|
|
1325
1325
|
|
|
1326
|
+
// packages/text2sql/src/lib/adapters/postgres/postgres-parser-workaround.ts
|
|
1327
|
+
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;
|
|
1328
|
+
var TIME_ZONE_SUFFIX = /^\s+time\s+zone\s+/i;
|
|
1329
|
+
var TIME_BEFORE_SUFFIX = /(?<type>time(?:stamp)?(?:\s*\(\s*\d+\s*\))?)\s+(?<qualifier>with|without)$/i;
|
|
1330
|
+
function recoverPostgresTypedLiteralParserGap(sql, error) {
|
|
1331
|
+
const errorOffset = parserErrorOffset(error);
|
|
1332
|
+
if (errorOffset === null) return null;
|
|
1333
|
+
const prefix = sql.slice(0, errorOffset);
|
|
1334
|
+
let literalStart = errorOffset;
|
|
1335
|
+
let literalEnd = findLiteralEnd(sql, literalStart);
|
|
1336
|
+
let typeMatch = TYPE_BEFORE_LITERAL.exec(prefix);
|
|
1337
|
+
let type = typeMatch?.groups?.type;
|
|
1338
|
+
if (literalEnd === null) {
|
|
1339
|
+
const suffixMatch = TIME_ZONE_SUFFIX.exec(sql.slice(errorOffset));
|
|
1340
|
+
typeMatch = TIME_BEFORE_SUFFIX.exec(prefix);
|
|
1341
|
+
type = typeMatch?.groups?.type && typeMatch.groups.qualifier && suffixMatch ? `${typeMatch.groups.type} ${typeMatch.groups.qualifier} TIME ZONE` : void 0;
|
|
1342
|
+
literalStart = errorOffset + (suffixMatch?.[0].length ?? 0);
|
|
1343
|
+
literalEnd = findLiteralEnd(sql, literalStart);
|
|
1344
|
+
}
|
|
1345
|
+
if (!type || typeMatch?.index === void 0 || literalEnd === null)
|
|
1346
|
+
return null;
|
|
1347
|
+
return prefix.slice(0, typeMatch.index) + `CAST(${sql.slice(literalStart, literalEnd)} AS ${parserType(type)})` + sql.slice(literalEnd);
|
|
1348
|
+
}
|
|
1349
|
+
function parserErrorOffset(error) {
|
|
1350
|
+
if (typeof error !== "object" || error === null) return null;
|
|
1351
|
+
const location = Reflect.get(error, "location");
|
|
1352
|
+
if (typeof location !== "object" || location === null) return null;
|
|
1353
|
+
const start = Reflect.get(location, "start");
|
|
1354
|
+
if (typeof start !== "object" || start === null) return null;
|
|
1355
|
+
const offset = Reflect.get(start, "offset");
|
|
1356
|
+
return typeof offset === "number" ? offset : null;
|
|
1357
|
+
}
|
|
1358
|
+
function findLiteralEnd(sql, start) {
|
|
1359
|
+
if (sql[start] !== "'") {
|
|
1360
|
+
const delimiter = /^\$(?:[A-Za-z_][A-Za-z0-9_]*)?\$/.exec(
|
|
1361
|
+
sql.slice(start)
|
|
1362
|
+
)?.[0];
|
|
1363
|
+
if (!delimiter) return null;
|
|
1364
|
+
const end = sql.indexOf(delimiter, start + delimiter.length);
|
|
1365
|
+
return end === -1 ? null : end + delimiter.length;
|
|
1366
|
+
}
|
|
1367
|
+
let offset = start + 1;
|
|
1368
|
+
while (offset < sql.length) {
|
|
1369
|
+
if (sql[offset] === "\\") {
|
|
1370
|
+
offset += 2;
|
|
1371
|
+
continue;
|
|
1372
|
+
}
|
|
1373
|
+
if (sql[offset] !== "'") {
|
|
1374
|
+
offset++;
|
|
1375
|
+
continue;
|
|
1376
|
+
}
|
|
1377
|
+
if (sql[offset + 1] === "'") {
|
|
1378
|
+
offset += 2;
|
|
1379
|
+
continue;
|
|
1380
|
+
}
|
|
1381
|
+
return offset + 1;
|
|
1382
|
+
}
|
|
1383
|
+
return null;
|
|
1384
|
+
}
|
|
1385
|
+
function parserType(type) {
|
|
1386
|
+
const unqualified = type.replace(/^pg_catalog\./i, "");
|
|
1387
|
+
const timetz = /^timetz(\s*\([^)]*\))?$/i.exec(unqualified);
|
|
1388
|
+
return timetz ? `TIME${timetz[1] ?? ""} WITH TIME ZONE` : unqualified;
|
|
1389
|
+
}
|
|
1390
|
+
|
|
1326
1391
|
// packages/text2sql/src/lib/adapters/parser-sql-policy.ts
|
|
1327
1392
|
var READ_ONLY_MESSAGE = "only SELECT or WITH queries allowed";
|
|
1328
1393
|
var { Parser } = nodeSqlParser;
|
|
@@ -1347,7 +1412,7 @@ var ParserSqlPolicyAnalyzer = class {
|
|
|
1347
1412
|
#readParsedStatements(sql) {
|
|
1348
1413
|
for (const dialect of this.dialects) {
|
|
1349
1414
|
try {
|
|
1350
|
-
return parseStatements(sql, dialect);
|
|
1415
|
+
return this.#parseStatements(sql, dialect);
|
|
1351
1416
|
} catch {
|
|
1352
1417
|
}
|
|
1353
1418
|
}
|
|
@@ -1359,7 +1424,7 @@ var ParserSqlPolicyAnalyzer = class {
|
|
|
1359
1424
|
let lastDialect = this.dialects[0];
|
|
1360
1425
|
for (const dialect of this.dialects) {
|
|
1361
1426
|
try {
|
|
1362
|
-
references = extractBaseEntityReferences(sql, dialect);
|
|
1427
|
+
references = extractBaseEntityReferences(this.#parseAst(sql, dialect));
|
|
1363
1428
|
break;
|
|
1364
1429
|
} catch (error) {
|
|
1365
1430
|
lastDialect = dialect;
|
|
@@ -1394,9 +1459,25 @@ var ParserSqlPolicyAnalyzer = class {
|
|
|
1394
1459
|
});
|
|
1395
1460
|
return outOfScope.length === 0 ? null : buildOutOfScopePayload(sql, outOfScope, [...allowedEntities]);
|
|
1396
1461
|
}
|
|
1462
|
+
#parseStatements(sql, dialect) {
|
|
1463
|
+
return parseStatements(this.#parseAst(sql, dialect));
|
|
1464
|
+
}
|
|
1465
|
+
#parseAst(sql, dialect) {
|
|
1466
|
+
let parserSql = sql;
|
|
1467
|
+
const attempted = /* @__PURE__ */ new Set([sql]);
|
|
1468
|
+
while (true) {
|
|
1469
|
+
try {
|
|
1470
|
+
return parser.astify(parserSql, { database: dialect });
|
|
1471
|
+
} catch (error) {
|
|
1472
|
+
const recovered = dialect === "postgresql" ? recoverPostgresTypedLiteralParserGap(parserSql, error) : null;
|
|
1473
|
+
if (!recovered || attempted.has(recovered)) throw error;
|
|
1474
|
+
attempted.add(recovered);
|
|
1475
|
+
parserSql = recovered;
|
|
1476
|
+
}
|
|
1477
|
+
}
|
|
1478
|
+
}
|
|
1397
1479
|
};
|
|
1398
|
-
function parseStatements(
|
|
1399
|
-
const ast = parser.astify(sql, { database: dialect });
|
|
1480
|
+
function parseStatements(ast) {
|
|
1400
1481
|
const statements = Array.isArray(ast) ? ast : [ast];
|
|
1401
1482
|
return statements.filter(isAstLike);
|
|
1402
1483
|
}
|
|
@@ -1453,8 +1534,7 @@ function appendIdentifierParts(parts, value) {
|
|
|
1453
1534
|
...value.toLowerCase().split(".").filter((part) => part.length > 0)
|
|
1454
1535
|
);
|
|
1455
1536
|
}
|
|
1456
|
-
function extractBaseEntityReferences(
|
|
1457
|
-
const ast = parser.astify(sql, { database: dialect });
|
|
1537
|
+
function extractBaseEntityReferences(ast) {
|
|
1458
1538
|
const state = {
|
|
1459
1539
|
cteNames: /* @__PURE__ */ new Set(),
|
|
1460
1540
|
references: /* @__PURE__ */ new Map()
|