@@ -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} ) ;
0 commit comments