mirror of
https://github.com/t8y2/dbx.git
synced 2026-10-20 00:17:44 +00:00
@@ -9,11 +9,43 @@ describe("extractSqlParameters", () => {
|
||||
expect(readSqlBracedParameterAt("#{month}", 0, { enabledSyntaxes: ["shell"] })).toBeNull();
|
||||
});
|
||||
|
||||
it("recognizes dotted braced parameter names as complete keys", () => {
|
||||
expect(readSqlBracedParameterAt("${params.profile.name}", 0)).toMatchObject({
|
||||
key: "params.profile.name",
|
||||
name: "params.profile.name",
|
||||
syntax: "shell",
|
||||
});
|
||||
expect(readSqlBracedParameterAt("#{ 参数.用户_2.名称 }", 0)).toMatchObject({
|
||||
key: "参数.用户_2.名称",
|
||||
name: "参数.用户_2.名称",
|
||||
syntax: "mybatis",
|
||||
});
|
||||
});
|
||||
|
||||
it("rejects malformed dotted braced parameter names", () => {
|
||||
for (const token of ["${.name}", "${params.}", "${params..name}", "${params.1name}", "${params[0]}"]) {
|
||||
expect(readSqlBracedParameterAt(token, 0)).toBeNull();
|
||||
expect(extractSqlParameters(`select ${token}`)).toEqual([]);
|
||||
}
|
||||
});
|
||||
|
||||
it("keeps colon and at-sign parameters single-segment", () => {
|
||||
expect(extractSqlParameterDescriptors("select :params.name, @context.user")).toEqual([
|
||||
{ key: "params", name: "params", syntax: "named", token: ":params" },
|
||||
{ key: "context", name: "context", syntax: "sqlserver", token: "@context" },
|
||||
]);
|
||||
});
|
||||
|
||||
it("extracts unique template parameters in order", () => {
|
||||
const sql = "select * from t where pt_dt between ${start_date} and ${end_date} or pt_dt = ${start_date}";
|
||||
expect(extractSqlParameters(sql)).toEqual(["start_date", "end_date"]);
|
||||
});
|
||||
|
||||
it("extracts dotted braced parameters in unquoted and quoted contexts", () => {
|
||||
const sql = "select ${params.id}, #{params.profile.name}, '${params.label}', 'prefix#{params.code}'";
|
||||
expect(extractSqlParameters(sql)).toEqual(["params.id", "params.profile.name", "params.label", "params.code"]);
|
||||
});
|
||||
|
||||
it("extracts quoted braced placeholders while ignoring backticks and comments", () => {
|
||||
const sql = `
|
||||
select '\${quoted}' as a, "\${identifier}" as b, \`\${mysql_identifier}\`
|
||||
@@ -521,6 +553,17 @@ describe("Oracle and Dameng trigger pseudo-records", () => {
|
||||
});
|
||||
|
||||
describe("substituteSqlParameters", () => {
|
||||
it("substitutes dotted names by their complete key", () => {
|
||||
const sql = "select ${params.id}, #{params.profile.name}, 'prefix${params.label}'";
|
||||
expect(
|
||||
substituteSqlParameters(sql, {
|
||||
"params.id": { kind: "number", value: "7" },
|
||||
"params.profile.name": { kind: "string", value: "Alice" },
|
||||
"params.label": { kind: "string", value: "O'Reilly" },
|
||||
}),
|
||||
).toBe("select 7, 'Alice', 'prefixO''Reilly'");
|
||||
});
|
||||
|
||||
it("decodes XML comparison entities when substituting MyBatis parameters", () => {
|
||||
const sql = "select * from orders where created_at >= #{start} and created_at < #{end} and owner_id = #{owner_id} or reviewer_id = #{owner_id}";
|
||||
|
||||
|
||||
@@ -309,6 +309,11 @@ describe("splitSqlStatementRanges", () => {
|
||||
expect(rangeSqlTexts(splitSqlStatementRanges(sql, "kingbase"))).toEqual(["SELECT * FROM yd_org_decla_detail WHERE clr_ym = #{ym}", "SELECT 2"]);
|
||||
});
|
||||
|
||||
it("keeps dotted MyBatis placeholders instead of treating them as hash comments", () => {
|
||||
const sql = "SELECT * FROM users WHERE id = #{params.user.id};\nSELECT 2";
|
||||
expect(rangeSqlTexts(splitSqlStatementRanges(sql, "mysql"))).toEqual(["SELECT * FROM users WHERE id = #{params.user.id}", "SELECT 2"]);
|
||||
});
|
||||
|
||||
it("treats malformed or disabled MyBatis prefixes as hash comments", () => {
|
||||
expect(rangeSqlTexts(splitSqlStatementRanges("SELECT 1; #{1ym};\nSELECT 2", "kingbase"))).toEqual(["SELECT 1", "SELECT 2"]);
|
||||
expect(rangeSqlTexts(splitSqlStatementRanges("SELECT 1; #{ym};\nSELECT 2", "kingbase", { enabledSyntaxes: ["shell"] }))).toEqual(["SELECT 1", "SELECT 2"]);
|
||||
|
||||
@@ -43,7 +43,7 @@ export interface SqlParameterOptions {
|
||||
enabledSyntaxes?: readonly SqlParameterSyntax[];
|
||||
}
|
||||
|
||||
const PARAMETER_NAME_RE = /^[\p{L}_][\p{L}\p{N}_]*$/u;
|
||||
const PARAMETER_NAME_RE = /^[\p{L}_][\p{L}\p{N}_]*(?:\.[\p{L}_][\p{L}\p{N}_]*)*$/u;
|
||||
const PARAMETER_NAME_START_RE = /[\p{L}_]/u;
|
||||
const PARAMETER_NAME_CHAR_RE = /[\p{L}\p{N}_]/u;
|
||||
const SQL_SERVER_TEMP_TABLE_CONTEXT_KEYWORDS = new Set(["table", "from", "join", "into", "update", "truncate"]);
|
||||
|
||||
Reference in New Issue
Block a user