Skip to content

Commit 9ef7e2a

Browse files
committed
Fix for fn case sensitivity. Got tostring to work
1 parent a46c62a commit 9ef7e2a

File tree

3 files changed

+171
-57
lines changed

3 files changed

+171
-57
lines changed

internal-packages/clickhouse/src/tsqlFunctions.test.ts

Lines changed: 139 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,7 @@ const defaultTaskRun = {
9090
/**
9191
* Helper: execute a TSQL query and assert no errors.
9292
*/
93-
async function assertQueryExecutes(
94-
client: ClickhouseClient,
95-
tsqlQuery: string
96-
): Promise<void> {
93+
async function assertQueryExecutes(client: ClickhouseClient, tsqlQuery: string): Promise<void> {
9794
const [error] = await executeTSQL(client, {
9895
name: "func-test",
9996
query: tsqlQuery,
@@ -127,10 +124,7 @@ async function setupClient(clickhouseContainer: { getConnectionUrl(): string })
127124
* Helper: run all test cases in a single ClickHouse container.
128125
* Each case is a [name, tsqlQuery] tuple.
129126
*/
130-
async function runCases(
131-
client: ClickhouseClient,
132-
cases: [string, string][]
133-
): Promise<void> {
127+
async function runCases(client: ClickhouseClient, cases: [string, string][]): Promise<void> {
134128
const failures: string[] = [];
135129

136130
for (const [name, query] of cases) {
@@ -258,9 +252,15 @@ describe("TSQL Function Smoke Tests", () => {
258252
["replaceRegexpOne", "SELECT replaceRegexpOne(status, '[A-Z]+', 'X') AS r FROM task_runs"],
259253
["replaceRegexpAll", "SELECT replaceRegexpAll(status, '[A-Z]', 'x') AS r FROM task_runs"],
260254
["position", "SELECT position(status, 'COM') AS r FROM task_runs"],
261-
["positionCaseInsensitive", "SELECT positionCaseInsensitive(status, 'com') AS r FROM task_runs"],
255+
[
256+
"positionCaseInsensitive",
257+
"SELECT positionCaseInsensitive(status, 'com') AS r FROM task_runs",
258+
],
262259
["positionUTF8", "SELECT positionUTF8(status, 'COM') AS r FROM task_runs"],
263-
["positionCaseInsensitiveUTF8", "SELECT positionCaseInsensitiveUTF8(status, 'com') AS r FROM task_runs"],
260+
[
261+
"positionCaseInsensitiveUTF8",
262+
"SELECT positionCaseInsensitiveUTF8(status, 'com') AS r FROM task_runs",
263+
],
264264
["locate", "SELECT locate(status, 'COM') AS r FROM task_runs"],
265265
["match", "SELECT match(status, 'COMPLETED.*') AS r FROM task_runs"],
266266
["like", "SELECT like(status, '%COMPLETED%') AS r FROM task_runs"],
@@ -334,9 +334,7 @@ describe("TSQL Function Smoke Tests", () => {
334334
clickhouseTest("Type conversion functions", async ({ clickhouseContainer }) => {
335335
const client = await setupClient(clickhouseContainer);
336336
await runCases(client, [
337-
// toString: Skipped - TSQL_COMPARISON_MAPPING uses `in` operator which matches
338-
// Object.prototype.toString, causing it to be treated as a comparison function.
339-
// ["toString", "SELECT toString(usage_duration_ms) AS r FROM task_runs"],
337+
["toString", "SELECT toString(usage_duration_ms) AS r FROM task_runs"],
340338
["toFixedString", "SELECT toFixedString(status, 30) AS r FROM task_runs"],
341339
["toUInt8", "SELECT toUInt8(is_test) AS r FROM task_runs"],
342340
["toUInt16", "SELECT toUInt16(usage_duration_ms) AS r FROM task_runs"],
@@ -366,7 +364,10 @@ describe("TSQL Function Smoke Tests", () => {
366364
["toDateTimeOrNull", "SELECT toDateTimeOrNull('2024-01-01 00:00:00') AS r FROM task_runs"],
367365
["toDateTimeOrZero", "SELECT toDateTimeOrZero('invalid') AS r FROM task_runs"],
368366
["toDateTime64", "SELECT toDateTime64(created_at, 3) AS r FROM task_runs"],
369-
["toDateTime64OrNull", "SELECT toDateTime64OrNull('2024-01-01 00:00:00.000', 3) AS r FROM task_runs"],
367+
[
368+
"toDateTime64OrNull",
369+
"SELECT toDateTime64OrNull('2024-01-01 00:00:00.000', 3) AS r FROM task_runs",
370+
],
370371
["toDateTime64OrZero", "SELECT toDateTime64OrZero('invalid', 3) AS r FROM task_runs"],
371372
["toTypeName", "SELECT toTypeName(status) AS r FROM task_runs"],
372373
]);
@@ -403,7 +404,10 @@ describe("TSQL Function Smoke Tests", () => {
403404
["toStartOfFiveMinutes", "SELECT toStartOfFiveMinutes(created_at) AS r FROM task_runs"],
404405
["toStartOfTenMinutes", "SELECT toStartOfTenMinutes(created_at) AS r FROM task_runs"],
405406
["toStartOfFifteenMinutes", "SELECT toStartOfFifteenMinutes(created_at) AS r FROM task_runs"],
406-
["toStartOfInterval", "SELECT toStartOfInterval(created_at, INTERVAL 1 hour) AS r FROM task_runs"],
407+
[
408+
"toStartOfInterval",
409+
"SELECT toStartOfInterval(created_at, INTERVAL 1 hour) AS r FROM task_runs",
410+
],
407411
["toTime", "SELECT toTime(created_at) AS r FROM task_runs"],
408412
["toISOYear", "SELECT toISOYear(created_at) AS r FROM task_runs"],
409413
["toISOWeek", "SELECT toISOWeek(created_at) AS r FROM task_runs"],
@@ -412,14 +416,29 @@ describe("TSQL Function Smoke Tests", () => {
412416
["dateAdd (string unit)", "SELECT dateAdd('day', 7, created_at) AS r FROM task_runs"],
413417
["dateAdd (keyword unit)", "SELECT dateAdd(day, 7, created_at) AS r FROM task_runs"],
414418
["dateSub (string unit)", "SELECT dateSub('hour', 1, created_at) AS r FROM task_runs"],
415-
["dateDiff (string unit)", "SELECT dateDiff('minute', created_at, updated_at) AS r FROM task_runs"],
416-
["dateDiff (millisecond)", "SELECT dateDiff('millisecond', created_at, updated_at) AS r FROM task_runs"],
417-
["dateDiff (microsecond)", "SELECT dateDiff('microsecond', created_at, updated_at) AS r FROM task_runs"],
418-
["dateDiff (nanosecond)", "SELECT dateDiff('nanosecond', created_at, updated_at) AS r FROM task_runs"],
419+
[
420+
"dateDiff (string unit)",
421+
"SELECT dateDiff('minute', created_at, updated_at) AS r FROM task_runs",
422+
],
423+
[
424+
"dateDiff (millisecond)",
425+
"SELECT dateDiff('millisecond', created_at, updated_at) AS r FROM task_runs",
426+
],
427+
[
428+
"dateDiff (microsecond)",
429+
"SELECT dateDiff('microsecond', created_at, updated_at) AS r FROM task_runs",
430+
],
431+
[
432+
"dateDiff (nanosecond)",
433+
"SELECT dateDiff('nanosecond', created_at, updated_at) AS r FROM task_runs",
434+
],
419435
["dateTrunc (string unit)", "SELECT dateTrunc('month', created_at) AS r FROM task_runs"],
420436
["date_add (string unit)", "SELECT date_add('day', 7, created_at) AS r FROM task_runs"],
421437
["date_sub (string unit)", "SELECT date_sub('hour', 1, created_at) AS r FROM task_runs"],
422-
["date_diff (string unit)", "SELECT date_diff('minute', created_at, updated_at) AS r FROM task_runs"],
438+
[
439+
"date_diff (string unit)",
440+
"SELECT date_diff('minute', created_at, updated_at) AS r FROM task_runs",
441+
],
423442
["date_trunc (string unit)", "SELECT date_trunc('month', created_at) AS r FROM task_runs"],
424443
["addSeconds", "SELECT addSeconds(created_at, 10) AS r FROM task_runs"],
425444
["addMinutes", "SELECT addMinutes(created_at, 10) AS r FROM task_runs"],
@@ -440,12 +459,30 @@ describe("TSQL Function Smoke Tests", () => {
440459
["toTimeZone", "SELECT toTimeZone(created_at, 'America/New_York') AS r FROM task_runs"],
441460
["formatDateTime", "SELECT formatDateTime(created_at, '%Y-%m-%d') AS r FROM task_runs"],
442461
["parseDateTime", "SELECT parseDateTime('2024-01-15', '%Y-%m-%d') AS r FROM task_runs"],
443-
["parseDateTimeBestEffort", "SELECT parseDateTimeBestEffort('2024-01-15 10:30:00') AS r FROM task_runs"],
444-
["parseDateTimeBestEffortOrNull", "SELECT parseDateTimeBestEffortOrNull('invalid') AS r FROM task_runs"],
445-
["parseDateTimeBestEffortOrZero", "SELECT parseDateTimeBestEffortOrZero('invalid') AS r FROM task_runs"],
446-
["parseDateTime64BestEffort", "SELECT parseDateTime64BestEffort('2024-01-15 10:30:00.123') AS r FROM task_runs"],
447-
["parseDateTime64BestEffortOrNull", "SELECT parseDateTime64BestEffortOrNull('invalid') AS r FROM task_runs"],
448-
["parseDateTime64BestEffortOrZero", "SELECT parseDateTime64BestEffortOrZero('invalid') AS r FROM task_runs"],
462+
[
463+
"parseDateTimeBestEffort",
464+
"SELECT parseDateTimeBestEffort('2024-01-15 10:30:00') AS r FROM task_runs",
465+
],
466+
[
467+
"parseDateTimeBestEffortOrNull",
468+
"SELECT parseDateTimeBestEffortOrNull('invalid') AS r FROM task_runs",
469+
],
470+
[
471+
"parseDateTimeBestEffortOrZero",
472+
"SELECT parseDateTimeBestEffortOrZero('invalid') AS r FROM task_runs",
473+
],
474+
[
475+
"parseDateTime64BestEffort",
476+
"SELECT parseDateTime64BestEffort('2024-01-15 10:30:00.123') AS r FROM task_runs",
477+
],
478+
[
479+
"parseDateTime64BestEffortOrNull",
480+
"SELECT parseDateTime64BestEffortOrNull('invalid') AS r FROM task_runs",
481+
],
482+
[
483+
"parseDateTime64BestEffortOrZero",
484+
"SELECT parseDateTime64BestEffortOrZero('invalid') AS r FROM task_runs",
485+
],
449486
]);
450487
});
451488

@@ -509,7 +546,10 @@ describe("TSQL Function Smoke Tests", () => {
509546
["arraySum", "SELECT arraySum(array(1, 2, 3)) AS r FROM task_runs"],
510547
["arrayAvg", "SELECT arrayAvg(array(1, 2, 3)) AS r FROM task_runs"],
511548
["arrayCumSum", "SELECT arrayCumSum(array(1, 2, 3)) AS r FROM task_runs"],
512-
["arrayCumSumNonNegative", "SELECT arrayCumSumNonNegative(array(1, -2, 3)) AS r FROM task_runs"],
549+
[
550+
"arrayCumSumNonNegative",
551+
"SELECT arrayCumSumNonNegative(array(1, -2, 3)) AS r FROM task_runs",
552+
],
513553
["arrayProduct", "SELECT arrayProduct(array(1, 2, 3)) AS r FROM task_runs"],
514554
["arrayJoin", "SELECT arrayJoin(array(1, 2, 3)) AS r FROM task_runs"],
515555
]);
@@ -529,7 +569,10 @@ describe("TSQL Function Smoke Tests", () => {
529569
["JSONExtractBool", `SELECT JSONExtractBool('{"a": true}', 'a') AS r FROM task_runs`],
530570
["JSONExtractString", `SELECT JSONExtractString('{"a": "hello"}', 'a') AS r FROM task_runs`],
531571
["JSONExtractRaw", `SELECT JSONExtractRaw('{"a": [1,2]}', 'a') AS r FROM task_runs`],
532-
["JSONExtractArrayRaw", `SELECT JSONExtractArrayRaw('{"a": [1,2]}', 'a') AS r FROM task_runs`],
572+
[
573+
"JSONExtractArrayRaw",
574+
`SELECT JSONExtractArrayRaw('{"a": [1,2]}', 'a') AS r FROM task_runs`,
575+
],
533576
["JSONExtractKeys", `SELECT JSONExtractKeys('{"a": 1, "b": 2}') AS r FROM task_runs`],
534577
["toJSONString", "SELECT toJSONString(map('a', 1)) AS r FROM task_runs"],
535578
]);
@@ -598,9 +641,18 @@ describe("TSQL Function Smoke Tests", () => {
598641
["domain", `SELECT domain('${url}') AS r FROM task_runs`],
599642
["domainWithoutWWW", `SELECT domainWithoutWWW('${url}') AS r FROM task_runs`],
600643
["topLevelDomain", `SELECT topLevelDomain('${url}') AS r FROM task_runs`],
601-
["firstSignificantSubdomain", `SELECT firstSignificantSubdomain('${url}') AS r FROM task_runs`],
602-
["cutToFirstSignificantSubdomain", `SELECT cutToFirstSignificantSubdomain('${url}') AS r FROM task_runs`],
603-
["cutToFirstSignificantSubdomainWithWWW", `SELECT cutToFirstSignificantSubdomainWithWWW('${url}') AS r FROM task_runs`],
644+
[
645+
"firstSignificantSubdomain",
646+
`SELECT firstSignificantSubdomain('${url}') AS r FROM task_runs`,
647+
],
648+
[
649+
"cutToFirstSignificantSubdomain",
650+
`SELECT cutToFirstSignificantSubdomain('${url}') AS r FROM task_runs`,
651+
],
652+
[
653+
"cutToFirstSignificantSubdomainWithWWW",
654+
`SELECT cutToFirstSignificantSubdomainWithWWW('${url}') AS r FROM task_runs`,
655+
],
604656
["port", `SELECT port('${url}') AS r FROM task_runs`],
605657
["path", `SELECT path('${url}') AS r FROM task_runs`],
606658
["pathFull", `SELECT pathFull('${url}') AS r FROM task_runs`],
@@ -619,8 +671,14 @@ describe("TSQL Function Smoke Tests", () => {
619671
const client = await setupClient(clickhouseContainer);
620672
await runCases(client, [
621673
["generateUUIDv4", "SELECT generateUUIDv4() AS r FROM task_runs"],
622-
["UUIDStringToNum", "SELECT UUIDStringToNum('00000000-0000-0000-0000-000000000000') AS r FROM task_runs"],
623-
["UUIDNumToString", "SELECT UUIDNumToString(UUIDStringToNum('00000000-0000-0000-0000-000000000000')) AS r FROM task_runs"],
674+
[
675+
"UUIDStringToNum",
676+
"SELECT UUIDStringToNum('00000000-0000-0000-0000-000000000000') AS r FROM task_runs",
677+
],
678+
[
679+
"UUIDNumToString",
680+
"SELECT UUIDNumToString(UUIDStringToNum('00000000-0000-0000-0000-000000000000')) AS r FROM task_runs",
681+
],
624682
["toUUID", "SELECT toUUID('00000000-0000-0000-0000-000000000000') AS r FROM task_runs"],
625683
["toUUIDOrNull", "SELECT toUUIDOrNull('not-a-uuid') AS r FROM task_runs"],
626684
["toUUIDOrZero", "SELECT toUUIDOrZero('not-a-uuid') AS r FROM task_runs"],
@@ -643,7 +701,10 @@ describe("TSQL Function Smoke Tests", () => {
643701
"transform",
644702
"SELECT transform(status, array('PENDING', 'COMPLETED_SUCCESSFULLY'), array('P', 'C'), 'X') AS r FROM task_runs",
645703
],
646-
["formatReadableDecimalSize", "SELECT formatReadableDecimalSize(1000000) AS r FROM task_runs"],
704+
[
705+
"formatReadableDecimalSize",
706+
"SELECT formatReadableDecimalSize(1000000) AS r FROM task_runs",
707+
],
647708
["formatReadableSize", "SELECT formatReadableSize(1000000) AS r FROM task_runs"],
648709
["formatReadableQuantity", "SELECT formatReadableQuantity(1000000) AS r FROM task_runs"],
649710
["formatReadableTimeDelta", "SELECT formatReadableTimeDelta(3661) AS r FROM task_runs"],
@@ -691,7 +752,10 @@ describe("TSQL Function Smoke Tests", () => {
691752
["quantile", "SELECT quantile(0.95)(usage_duration_ms) AS r FROM task_runs"],
692753
["quantiles", "SELECT quantiles(0.5, 0.9, 0.99)(usage_duration_ms) AS r FROM task_runs"],
693754
["topK", "SELECT topK(3)(status) AS r FROM task_runs"],
694-
["simpleLinearRegression", "SELECT simpleLinearRegression(usage_duration_ms, cost_in_cents) AS r FROM task_runs"],
755+
[
756+
"simpleLinearRegression",
757+
"SELECT simpleLinearRegression(usage_duration_ms, cost_in_cents) AS r FROM task_runs",
758+
],
695759
["groupArraySample", "SELECT groupArraySample(2)(status) AS r FROM task_runs"],
696760
]);
697761
});
@@ -702,7 +766,10 @@ describe("TSQL Function Smoke Tests", () => {
702766
const client = await setupClient(clickhouseContainer);
703767
await runCases(client, [
704768
["countIf", "SELECT countIf(usage_duration_ms > 1000) AS r FROM task_runs"],
705-
["countDistinctIf", "SELECT countDistinctIf(status, usage_duration_ms > 0) AS r FROM task_runs"],
769+
[
770+
"countDistinctIf",
771+
"SELECT countDistinctIf(status, usage_duration_ms > 0) AS r FROM task_runs",
772+
],
706773
["minIf", "SELECT minIf(usage_duration_ms, is_test = 0) AS r FROM task_runs"],
707774
["maxIf", "SELECT maxIf(usage_duration_ms, is_test = 0) AS r FROM task_runs"],
708775
["sumIf", "SELECT sumIf(usage_duration_ms, is_test = 0) AS r FROM task_runs"],
@@ -711,7 +778,10 @@ describe("TSQL Function Smoke Tests", () => {
711778
["anyLastIf", "SELECT anyLastIf(status, usage_duration_ms > 0) AS r FROM task_runs"],
712779
["anyHeavyIf", "SELECT anyHeavyIf(status, usage_duration_ms > 0) AS r FROM task_runs"],
713780
["groupArrayIf", "SELECT groupArrayIf(status, usage_duration_ms > 0) AS r FROM task_runs"],
714-
["groupUniqArrayIf", "SELECT groupUniqArrayIf(status, usage_duration_ms > 0) AS r FROM task_runs"],
781+
[
782+
"groupUniqArrayIf",
783+
"SELECT groupUniqArrayIf(status, usage_duration_ms > 0) AS r FROM task_runs",
784+
],
715785
["uniqIf", "SELECT uniqIf(status, usage_duration_ms > 0) AS r FROM task_runs"],
716786
["uniqExactIf", "SELECT uniqExactIf(status, usage_duration_ms > 0) AS r FROM task_runs"],
717787
["medianIf", "SELECT medianIf(usage_duration_ms, is_test = 0) AS r FROM task_runs"],
@@ -726,16 +796,40 @@ describe("TSQL Function Smoke Tests", () => {
726796
clickhouseTest("Search functions", async ({ clickhouseContainer }) => {
727797
const client = await setupClient(clickhouseContainer);
728798
await runCases(client, [
729-
["multiMatchAny", "SELECT multiMatchAny(status, array('COMPLETED.*', 'PENDING')) AS r FROM task_runs"],
730-
["multiMatchAnyIndex", "SELECT multiMatchAnyIndex(status, array('COMPLETED.*', 'PENDING')) AS r FROM task_runs"],
731-
["multiMatchAllIndices", "SELECT multiMatchAllIndices(status, array('COMPLETED.*', 'PEND.*')) AS r FROM task_runs"],
732-
["multiSearchFirstPosition", "SELECT multiSearchFirstPosition(status, array('COMP', 'PEND')) AS r FROM task_runs"],
733-
["multiSearchFirstIndex", "SELECT multiSearchFirstIndex(status, array('COMP', 'PEND')) AS r FROM task_runs"],
734-
["multiSearchAny", "SELECT multiSearchAny(status, array('COMP', 'PEND')) AS r FROM task_runs"],
799+
[
800+
"multiMatchAny",
801+
"SELECT multiMatchAny(status, array('COMPLETED.*', 'PENDING')) AS r FROM task_runs",
802+
],
803+
[
804+
"multiMatchAnyIndex",
805+
"SELECT multiMatchAnyIndex(status, array('COMPLETED.*', 'PENDING')) AS r FROM task_runs",
806+
],
807+
[
808+
"multiMatchAllIndices",
809+
"SELECT multiMatchAllIndices(status, array('COMPLETED.*', 'PEND.*')) AS r FROM task_runs",
810+
],
811+
[
812+
"multiSearchFirstPosition",
813+
"SELECT multiSearchFirstPosition(status, array('COMP', 'PEND')) AS r FROM task_runs",
814+
],
815+
[
816+
"multiSearchFirstIndex",
817+
"SELECT multiSearchFirstIndex(status, array('COMP', 'PEND')) AS r FROM task_runs",
818+
],
819+
[
820+
"multiSearchAny",
821+
"SELECT multiSearchAny(status, array('COMP', 'PEND')) AS r FROM task_runs",
822+
],
735823
["extract", "SELECT extract(status, '[A-Z]+') AS r FROM task_runs"],
736824
["extractAll", "SELECT extractAll(status, '[A-Z]+') AS r FROM task_runs"],
737-
["extractAllGroupsHorizontal", "SELECT extractAllGroupsHorizontal(status, '([A-Z]+)') AS r FROM task_runs"],
738-
["extractAllGroupsVertical", "SELECT extractAllGroupsVertical(status, '([A-Z]+)') AS r FROM task_runs"],
825+
[
826+
"extractAllGroupsHorizontal",
827+
"SELECT extractAllGroupsHorizontal(status, '([A-Z]+)') AS r FROM task_runs",
828+
],
829+
[
830+
"extractAllGroupsVertical",
831+
"SELECT extractAllGroupsVertical(status, '([A-Z]+)') AS r FROM task_runs",
832+
],
739833
]);
740834
});
741835
});

internal-packages/tsql/src/query/functions.ts

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -562,25 +562,45 @@ export const TSQL_AGGREGATIONS: Record<string, TSQLFunctionMeta> = {
562562
};
563563

564564
/**
565-
* Find a function in the TSQL functions map
566-
* Supports case-insensitive lookup for non-case-sensitive functions
565+
* Build a lowercase lookup map from a functions record.
566+
* Uses a null-prototype object to avoid Object.prototype pollution (e.g. "toString").
567+
*/
568+
function buildLowercaseMap(
569+
functions: Record<string, TSQLFunctionMeta>
570+
): Record<string, TSQLFunctionMeta> {
571+
const map: Record<string, TSQLFunctionMeta> = Object.create(null);
572+
for (const [key, value] of Object.entries(functions)) {
573+
map[key.toLowerCase()] = value;
574+
}
575+
return map;
576+
}
577+
578+
const FUNCTIONS_LOWERCASE = buildLowercaseMap(TSQL_CLICKHOUSE_FUNCTIONS);
579+
const AGGREGATIONS_LOWERCASE = buildLowercaseMap(TSQL_AGGREGATIONS);
580+
581+
/**
582+
* Find a function in the TSQL functions map.
583+
* Supports case-insensitive lookup for non-case-sensitive functions.
584+
*
585+
* @param functions - The canonical functions record (exact-match lookup)
586+
* @param lowercaseMap - Pre-computed lowercase lookup (null-prototype, safe from prototype pollution)
567587
*/
568588
function findFunction(
569589
name: string,
570-
functions: Record<string, TSQLFunctionMeta>
590+
functions: Record<string, TSQLFunctionMeta>,
591+
lowercaseMap: Record<string, TSQLFunctionMeta>
571592
): TSQLFunctionMeta | undefined {
572-
const func = functions[name];
573-
if (func !== undefined) {
574-
return func;
593+
if (Object.prototype.hasOwnProperty.call(functions, name)) {
594+
return functions[name];
575595
}
576596

577-
const lowerFunc = functions[name.toLowerCase()];
597+
// Case-insensitive fallback using the pre-computed lowercase map
598+
const lowerFunc = lowercaseMap[name.toLowerCase()];
578599
if (lowerFunc === undefined) {
579600
return undefined;
580601
}
581602

582-
// If we haven't found a function with the case preserved, but we have found it in lowercase,
583-
// then the function names are different case-wise only.
603+
// If the function is case-sensitive, only the exact-match above should find it
584604
if (lowerFunc.caseSensitive) {
585605
return undefined;
586606
}
@@ -592,14 +612,14 @@ function findFunction(
592612
* Find a TSQL aggregation function by name
593613
*/
594614
export function findTSQLAggregation(name: string): TSQLFunctionMeta | undefined {
595-
return findFunction(name, TSQL_AGGREGATIONS);
615+
return findFunction(name, TSQL_AGGREGATIONS, AGGREGATIONS_LOWERCASE);
596616
}
597617

598618
/**
599619
* Find a TSQL function by name
600620
*/
601621
export function findTSQLFunction(name: string): TSQLFunctionMeta | undefined {
602-
return findFunction(name, TSQL_CLICKHOUSE_FUNCTIONS);
622+
return findFunction(name, TSQL_CLICKHOUSE_FUNCTIONS, FUNCTIONS_LOWERCASE);
603623
}
604624

605625
/**

0 commit comments

Comments
 (0)