Skip to content

Commit 01cd8d2

Browse files
committed
fix(vnext): bound identifier callbacks
1 parent eea3f34 commit 01cd8d2

2 files changed

Lines changed: 43 additions & 0 deletions

File tree

src/vnext/__tests__/query-site.test.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,47 @@ describe("fail-closed query-site behavior", () => {
849849
).toBe("unavailable");
850850
});
851851

852+
it("enforces the bare identifier ceiling before dialect code for every role", () => {
853+
const maximumIdentifier = "x".repeat(
854+
MAX_QUERY_SITE_IDENTIFIER_LENGTH,
855+
);
856+
const oversizedIdentifier = "x".repeat(
857+
MAX_QUERY_SITE_IDENTIFIER_LENGTH + 1,
858+
);
859+
const roles: (
860+
| "explicit-alias"
861+
| "implicit-alias"
862+
| "using-column"
863+
)[] = [];
864+
const dialect: SqlQuerySiteDialect = {
865+
...postgresDialect,
866+
classifyIdentifierToken: (_rawIdentifier, _quoted, role) => {
867+
roles.push(role);
868+
return { status: "identifier", value: "decoded" };
869+
},
870+
};
871+
for (const marked of [
872+
`SELECT * FROM users ${maximumIdentifier} JOIN |`,
873+
`SELECT * FROM users AS ${maximumIdentifier} JOIN |`,
874+
`SELECT * FROM a JOIN b USING(${maximumIdentifier}) JOIN |`,
875+
]) {
876+
expect(recognize(marked, { dialect }).status).toBe("ready");
877+
}
878+
expect(roles).toEqual([
879+
"implicit-alias",
880+
"explicit-alias",
881+
"using-column",
882+
]);
883+
for (const marked of [
884+
`SELECT * FROM users ${oversizedIdentifier} JOIN |`,
885+
`SELECT * FROM users AS ${oversizedIdentifier} JOIN |`,
886+
`SELECT * FROM a JOIN b USING(${oversizedIdentifier}) JOIN |`,
887+
]) {
888+
expect(recognize(marked, { dialect }).status).toBe("unavailable");
889+
}
890+
expect(roles).toHaveLength(3);
891+
});
892+
852893
it.each([
853894
'SELECT * FROM users "" JOIN |',
854895
'SELECT * FROM users AS "" JOIN |',

src/vnext/query-site.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,8 @@ function classifyIdentifierToken(
650650
): "identifier" | "unsupported" | null {
651651
if (
652652
rawIdentifier.length === 0 ||
653+
(!quoted &&
654+
rawIdentifier.length > MAX_QUERY_SITE_IDENTIFIER_LENGTH) ||
653655
(quoted && rawIdentifier.length <= 2)
654656
) {
655657
return null;

0 commit comments

Comments
 (0)