Everybody who used clickhouse for a longer time probably will agree that sometimes it's a bit like going through minefild - you can just type something in console and server will die with segfault.
The list of issues about segfault is quite long:
https://github.com/yandex/ClickHouse/issues?utf8=%E2%9C%93&q=fault
I think, this is a fiasco!
https://github.com/yandex/ClickHouse/issues/1281#issuecomment-341040084
It's hard not to agree with @akonyaev90. Fact that some user input (correct or not) can lead to server crash is really a huge problem. And if that request will be propagated - whole cluster will die.
How do you deal with that risk in Yandex?
You can't just close one bug after another, hoping that one day all bugs will be solved. Bugs is a normal part of any software, software should be able to deal with exceptions, not just die. Some generalized solution is needed to prevent server crashes.
May be that kind of errors can be sandboxed? So one / few threads die, but server survive?
May be circuit breaker pattern of other techniques can help to solve that problem? (Check "Release It" by Michael Nygard, it describes circuit breaker pattern and other concepts of making software stable)
Is there some plans to solve that? How can i say to any OPs or management that we should start using Clickhouse if can just randomly die because of something stupid like bad user input?
Nullable support I'm not sure it's considered anyway stable or I personally believe they are not using it yet in production. There are too many bugs with nullable columns: alter not working, some aggregate functions are not working as well, crashes like the one in ticket 1281.
@silviucpp unfortunately it's not only about NULLs.
For example try SELECT caseWithExpr(); Mine v1.1.54304 dies.
I hope that @alexey-milovidov and all clickhouse team will find some general solution to prevent server crashes caused by user input in the future, but probably architecture improvements can take some time. As for now some monkey-testing can help to find such a silly and painfull bugs. May be i will try to create some script for that.
More about architecture: for example why not to store function signatures? In that case you can check the signatures during parsing (not while execution function). You will also know exact response type. And while writing function you will not need to check & sanitize user input. Bad input just can't get into AST, and everything that CAN be pushed inside AST can be also executed. And you will able to remove all that lines like 'that functions expects 3 parameters, and you passed 1' inside functions.
In that sense - standard parsers have advantages. That checks can be done even on grammar definition level, and it will just return parse error instead of trying to execute some wierd user input.
Another reason for making function signatures which should be checked at parse time:
select asflwernwer( (SELECT max(number) from some_huge_table ) );
It will calclulate whole select to tell at the end that there is no such a function asflwernwer.
List of function calls which produce segfaults on v1.1.54304. Mostly connected with NULL and Nullables, please check on master.
toNullable(CAST('\0' AS Nullable(String)))
assumeNotNull(CAST('\0' AS Nullable(String)))
tan(NULL)
sin(NULL)
lgamma(NULL)
erfc(NULL)
erf(NULL)
sqrt(NULL)
log10(NULL)
tgamma(NULL)
exp10(NULL)
exp2(NULL)
exp(NULL)
decodeURLComponent(NULL)
cutFragment(NULL)
cutQueryString(NULL)
cutWWW(NULL)
cutToFirstSignificantSubdomain(NULL)
queryStringAndFragment(NULL)
queryString(NULL)
firstSignificantSubdomain(NULL)
domainWithoutWWW(NULL)
domain(NULL)
cbrt(NULL)
reverse(NULL)
lowerUTF8(NULL)
lower(NULL)
lengthUTF8(NULL)
notEmpty(CAST('\0' AS Nullable(FixedString(1))))
notEmpty(NULL)
trunc(NULL)
floor(NULL)
round(NULL)
roundAge(NULL)
roundDuration(NULL)
reinterpretAsDateTime(NULL)
reinterpretAsDate(NULL)
reinterpretAsFloat64(NULL)
reinterpretAsFloat32(NULL)
reinterpretAsInt32(NULL)
upperUTF8(NULL)
reinterpretAsInt8(NULL)
reinterpretAsUInt64(NULL)
reinterpretAsUInt32(NULL)
reinterpretAsUInt16(NULL)
randConstant(CAST( 0 AS Nullable(Int8)))
randConstant(CAST( 0 AS Nullable(Int16)))
randConstant(CAST( 0 AS Nullable(Int32)))
randConstant(CAST( 0 AS Nullable(Int64)))
randConstant(CAST( 0 AS Nullable(UInt8)))
randConstant(CAST( 0 AS Nullable(UInt16)))
randConstant(CAST( 0 AS Nullable(UInt32)))
randConstant(CAST( 0 AS Nullable(UInt64)))
randConstant(CAST( 0 AS Nullable(Float32)))
randConstant(CAST( 0 AS Nullable(Float64)))
randConstant(CAST( 0 AS Nullable(Date)))
randConstant(CAST( 0 AS Nullable(DateTime)))
randConstant(CAST( '0' AS Nullable(Enum8('0' = 0, 'z' = 1))))
randConstant(CAST('\0' AS Nullable(String)))
randConstant(CAST('\0' AS Nullable(FixedString(1))))
randConstant(CAST(NULL AS Nullable(Int8)))
randConstant(CAST(NULL AS Nullable(Int16)))
randConstant(CAST(NULL AS Nullable(Int32)))
randConstant(CAST(NULL AS Nullable(Int64)))
randConstant(CAST(NULL AS Nullable(UInt8)))
randConstant(CAST(NULL AS Nullable(UInt16)))
randConstant(CAST(NULL AS Nullable(UInt32)))
randConstant(CAST(NULL AS Nullable(UInt64)))
randConstant(CAST(NULL AS Nullable(Float32)))
randConstant(CAST(NULL AS Nullable(Float64)))
randConstant(CAST(NULL AS Nullable(Date)))
randConstant(CAST(NULL AS Nullable(DateTime)))
randConstant(CAST(NULL AS Nullable(Enum8('0' = 0, 'z' = 1))))
randConstant(CAST(NULL AS Nullable(String)))
isInfinite(NULL)
isNaN(NULL)
isFinite(NULL)
length(CAST('\0' AS Nullable(FixedString(1))))
length(NULL)
identity(CAST( 0 AS Nullable(Int8)))
identity(CAST( 0 AS Nullable(Int16)))
identity(CAST( 0 AS Nullable(Int32)))
identity(CAST( 0 AS Nullable(Int64)))
identity(CAST( 0 AS Nullable(UInt8)))
identity(CAST( 0 AS Nullable(UInt16)))
identity(CAST( 0 AS Nullable(UInt32)))
identity(CAST( 0 AS Nullable(UInt64)))
identity(CAST( 0 AS Nullable(Float32)))
identity(CAST( 0 AS Nullable(Float64)))
identity(CAST( 0 AS Nullable(Date)))
identity(CAST( 0 AS Nullable(DateTime)))
identity(CAST( '0' AS Nullable(Enum8('0' = 0, 'z' = 1))))
identity(CAST('\0' AS Nullable(String)))
identity(CAST('\0' AS Nullable(FixedString(1))))
identity(CAST(NULL AS Nullable(Int8)))
identity(CAST(NULL AS Nullable(Int16)))
identity(CAST(NULL AS Nullable(Int32)))
identity(CAST(NULL AS Nullable(Int64)))
identity(CAST(NULL AS Nullable(UInt8)))
identity(CAST(NULL AS Nullable(UInt16)))
identity(CAST(NULL AS Nullable(UInt32)))
identity(CAST(NULL AS Nullable(UInt64)))
identity(CAST(NULL AS Nullable(Float32)))
identity(CAST(NULL AS Nullable(Float64)))
identity(CAST(NULL AS Nullable(Date)))
identity(CAST(NULL AS Nullable(DateTime)))
identity(CAST(NULL AS Nullable(Enum8('0' = 0, 'z' = 1))))
identity(CAST(NULL AS Nullable(String)))
substring(NULL)
empty(CAST('\0' AS Nullable(FixedString(1))))
empty(NULL)
fragment(NULL)
ceil(NULL)
URLHash(NULL)
not(NULL)
intHash64(NULL)
toUInt8OrZero(NULL)
toRelativeSecondNum(NULL)
toFloat32(NULL)
toUInt64(NULL)
ceiling(NULL)
toStartOfMinute(NULL)
toUInt32(NULL)
cutQueryStringAndFragment(NULL)
toUInt8(NULL)
UUIDStringToNum(NULL)
upper(NULL)
roundToExp2(NULL)
cos(NULL)
UUIDNumToString(NULL)
log2(NULL)
toTime(NULL)
path(NULL)
toUInt16(NULL)
IPv4StringToNum(NULL)
reinterpretAsString(NULL)
IPv4NumToStringClassC(NULL)
toHour(NULL)
MACNumToString(NULL)
toInt64(NULL)
log(NULL)
toStringCutToZero(NULL)
toYYYYMMDDhhmmss(NULL)
toSecond(NULL)
SHA224(NULL)
MACStringToOUI(NULL)
toUInt64OrZero(NULL)
toDayOfMonth(NULL)
IPv4NumToString(NULL)
bar(NULL)
toDayOfWeek(NULL)
reinterpretAsInt64(NULL)
bitNot(NULL)
IPv6NumToString(NULL)
reinterpretAsUInt8(NULL)
toStartOfYear(NULL)
arrayConcat(NULL)
toDate(NULL)
reverseUTF8(NULL)
toStartOfQuarter(NULL)
toYYYYMMDD(NULL)
abs(NULL)
negate(NULL)
bitmaskToArray(NULL)
toDateTime(NULL)
toFloat64(NULL)
unhex(NULL)
toInt32(NULL)
topLevelDomain(NULL)
truncate(NULL)
toRelativeMinuteNum(NULL)
IPv4ToIPv6(NULL)
sipHash64(NULL)
protocol(NULL)
toInt16OrZero(NULL)
formatReadableSize(NULL)
concatAssumeInjective(NULL)
toString(NULL)
MACStringToNum(NULL)
toUnixTimestamp(NULL)
reinterpretAsInt16(NULL)
toInt16(NULL)
toUInt32OrZero(NULL)
toInt8OrZero(NULL)
toStartOfMonth(NULL)
toInt32OrZero(NULL)
pathFull(NULL)
toInt64OrZero(NULL)
toFloat32OrZero(NULL)
toFloat64OrZero(NULL)
atan(NULL)
toYear(NULL)
IPv6StringToNum(NULL)
toMonth(NULL)
concat(NULL)
toMinute(NULL)
toStartOfDay(NULL)
toMonday(NULL)
toUInt16OrZero(NULL)
toStartOfFiveMinute(NULL)
halfMD5(NULL)
toStartOfHour(NULL)
toRelativeYearNum(NULL)
toRelativeMonthNum(NULL)
toRelativeWeekNum(NULL)
toRelativeDayNum(NULL)
toRelativeHourNum(NULL)
farmHash64(CAST( 0 AS Nullable(Int8)))
farmHash64(CAST( 0 AS Nullable(Int16)))
farmHash64(CAST( 0 AS Nullable(Int32)))
farmHash64(CAST( 0 AS Nullable(Int64)))
farmHash64(CAST( 0 AS Nullable(UInt8)))
farmHash64(CAST( 0 AS Nullable(UInt16)))
farmHash64(CAST( 0 AS Nullable(UInt32)))
farmHash64(CAST( 0 AS Nullable(UInt64)))
farmHash64(CAST( 0 AS Nullable(Float32)))
farmHash64(CAST( 0 AS Nullable(Float64)))
farmHash64(CAST( 0 AS Nullable(Date)))
farmHash64(CAST( 0 AS Nullable(DateTime)))
farmHash64(CAST( '0' AS Nullable(Enum8('0' = 0, 'z' = 1))))
farmHash64(CAST('\0' AS Nullable(String)))
farmHash64(CAST('\0' AS Nullable(FixedString(1))))
farmHash64(CAST(NULL AS Nullable(Int8)))
farmHash64(CAST(NULL AS Nullable(Int16)))
farmHash64(CAST(NULL AS Nullable(Int32)))
farmHash64(CAST(NULL AS Nullable(Int64)))
farmHash64(CAST(NULL AS Nullable(UInt8)))
farmHash64(CAST(NULL AS Nullable(UInt16)))
farmHash64(CAST(NULL AS Nullable(UInt32)))
farmHash64(CAST(NULL AS Nullable(UInt64)))
farmHash64(CAST(NULL AS Nullable(Float32)))
farmHash64(CAST(NULL AS Nullable(Float64)))
farmHash64(CAST(NULL AS Nullable(Date)))
farmHash64(CAST(NULL AS Nullable(DateTime)))
farmHash64(CAST(NULL AS Nullable(Enum8('0' = 0, 'z' = 1))))
farmHash64(CAST(NULL AS Nullable(String)))
timeSlot(NULL)
hex(NULL)
toYYYYMM(NULL)
toInt8(NULL)
metroHash64(CAST( 0 AS Nullable(Int8)))
metroHash64(CAST( 0 AS Nullable(Int16)))
metroHash64(CAST( 0 AS Nullable(Int32)))
metroHash64(CAST( 0 AS Nullable(Int64)))
metroHash64(CAST( 0 AS Nullable(UInt8)))
metroHash64(CAST( 0 AS Nullable(UInt16)))
metroHash64(CAST( 0 AS Nullable(UInt32)))
metroHash64(CAST( 0 AS Nullable(UInt64)))
metroHash64(CAST( 0 AS Nullable(Float32)))
metroHash64(CAST( 0 AS Nullable(Float64)))
metroHash64(CAST( 0 AS Nullable(Date)))
metroHash64(CAST( 0 AS Nullable(DateTime)))
metroHash64(CAST( '0' AS Nullable(Enum8('0' = 0, 'z' = 1))))
metroHash64(CAST('\0' AS Nullable(String)))
metroHash64(CAST('\0' AS Nullable(FixedString(1))))
metroHash64(CAST(NULL AS Nullable(Int8)))
metroHash64(CAST(NULL AS Nullable(Int16)))
metroHash64(CAST(NULL AS Nullable(Int32)))
metroHash64(CAST(NULL AS Nullable(Int64)))
metroHash64(CAST(NULL AS Nullable(UInt8)))
metroHash64(CAST(NULL AS Nullable(UInt16)))
metroHash64(CAST(NULL AS Nullable(UInt32)))
metroHash64(CAST(NULL AS Nullable(UInt64)))
metroHash64(CAST(NULL AS Nullable(Float32)))
metroHash64(CAST(NULL AS Nullable(Float64)))
metroHash64(CAST(NULL AS Nullable(Date)))
metroHash64(CAST(NULL AS Nullable(DateTime)))
metroHash64(CAST(NULL AS Nullable(Enum8('0' = 0, 'z' = 1))))
metroHash64(CAST(NULL AS Nullable(String)))
acos(NULL)
toUUID(NULL)
runningDifference(CAST( 0 AS Nullable(Int8)))
runningDifference(CAST( 0 AS Nullable(Int16)))
runningDifference(CAST( 0 AS Nullable(Int32)))
runningDifference(CAST( 0 AS Nullable(Int64)))
runningDifference(CAST( 0 AS Nullable(UInt8)))
runningDifference(CAST( 0 AS Nullable(UInt16)))
runningDifference(CAST( 0 AS Nullable(UInt32)))
runningDifference(CAST( 0 AS Nullable(UInt64)))
runningDifference(CAST( 0 AS Nullable(Float32)))
runningDifference(CAST( 0 AS Nullable(Float64)))
runningDifference(CAST( 0 AS Nullable(Date)))
runningDifference(CAST( 0 AS Nullable(DateTime)))
runningDifference(CAST(NULL AS Nullable(Int8)))
runningDifference(CAST(NULL AS Nullable(Int16)))
runningDifference(CAST(NULL AS Nullable(Int32)))
runningDifference(CAST(NULL AS Nullable(Int64)))
runningDifference(CAST(NULL AS Nullable(UInt8)))
runningDifference(CAST(NULL AS Nullable(UInt16)))
runningDifference(CAST(NULL AS Nullable(UInt32)))
runningDifference(CAST(NULL AS Nullable(UInt64)))
runningDifference(CAST(NULL AS Nullable(Float32)))
runningDifference(CAST(NULL AS Nullable(Float64)))
runningDifference(CAST(NULL AS Nullable(Date)))
runningDifference(CAST(NULL AS Nullable(DateTime)))
bitmaskToList(NULL)
MD5(NULL)
SHA256(NULL)
asin(NULL)
SHA1(NULL)
sipHash128(NULL)
cityHash64(CAST( 0 AS Nullable(Int8)))
cityHash64(CAST( 0 AS Nullable(Int16)))
cityHash64(CAST( 0 AS Nullable(Int32)))
cityHash64(CAST( 0 AS Nullable(Int64)))
cityHash64(CAST( 0 AS Nullable(UInt8)))
cityHash64(CAST( 0 AS Nullable(UInt16)))
cityHash64(CAST( 0 AS Nullable(UInt32)))
cityHash64(CAST( 0 AS Nullable(UInt64)))
cityHash64(CAST( 0 AS Nullable(Float32)))
cityHash64(CAST( 0 AS Nullable(Float64)))
cityHash64(CAST( 0 AS Nullable(Date)))
cityHash64(CAST( 0 AS Nullable(DateTime)))
cityHash64(CAST( '0' AS Nullable(Enum8('0' = 0, 'z' = 1))))
cityHash64(CAST('\0' AS Nullable(String)))
cityHash64(CAST('\0' AS Nullable(FixedString(1))))
cityHash64(CAST(NULL AS Nullable(Int8)))
cityHash64(CAST(NULL AS Nullable(Int16)))
cityHash64(CAST(NULL AS Nullable(Int32)))
cityHash64(CAST(NULL AS Nullable(Int64)))
cityHash64(CAST(NULL AS Nullable(UInt8)))
cityHash64(CAST(NULL AS Nullable(UInt16)))
cityHash64(CAST(NULL AS Nullable(UInt32)))
cityHash64(CAST(NULL AS Nullable(UInt64)))
cityHash64(CAST(NULL AS Nullable(Float32)))
cityHash64(CAST(NULL AS Nullable(Float64)))
cityHash64(CAST(NULL AS Nullable(Date)))
cityHash64(CAST(NULL AS Nullable(DateTime)))
cityHash64(CAST(NULL AS Nullable(Enum8('0' = 0, 'z' = 1))))
cityHash64(CAST(NULL AS Nullable(String)))
intHash32(NULL)
topK(arrayPopBack([CAST('\0' AS Nullable(FixedString(1)))]))
topK([ [ [1], [2] ], [ [3], [4]] ])
Later will add more if that monkey-test script will find more
@filimonov this functions are crashing on master as well ? I'm asking because master have major changes for Nullable
on v1.1.54304. ... please check on master
Right now I have no possibility to test it on master (don't want to install lot of build stuff on old laptop), so please check if you can. Hope that most of cases will already work on master.
@proller i saw you've added a test cases. I didn't finish that monkey test session actually (it was slow, need to adjust it a bit, but currently have not too much time). More cases which were found before i've killed that:
visitParamExtractFloat('',CAST('\0' AS Nullable(String)))
visitParamExtractFloat('',CAST(NULL AS Nullable(String)))
visitParamExtractFloat(CAST('\0' AS Nullable(String)),'')
visitParamExtractFloat(CAST('\0' AS Nullable(String)),CAST('\0' AS Nullable(String)))
visitParamExtractFloat(CAST(NULL AS Nullable(String)),'')
visitParamHas('',CAST('\0' AS Nullable(String)))
visitParamHas(CAST('\0' AS Nullable(String)),'')
visitParamHas(CAST('\0' AS Nullable(String)),'\0\0\0\0\0\0\0\0\0\0')
visitParamHas(CAST(NULL AS Nullable(String)),'')
visitParamHas(CAST(NULL AS Nullable(String)),CAST('\0' AS Nullable(String)))
like('',CAST('\0' AS Nullable(String)))
like('',CAST(NULL AS Nullable(String)))
like('\0\0\0\0\0\0\0\0\0\0',CAST('\0' AS Nullable(String)))
like('\0\0\0\0\0\0\0\0\0\0',CAST(NULL AS Nullable(String)))
like(CAST('\0' AS Nullable(String)),'')
like(CAST(NULL AS Nullable(String)),'')
match('',CAST('\0' AS Nullable(String)))
match('',CAST(NULL AS Nullable(String)))
match(CAST('\0' AS Nullable(String)),CAST('\0' AS String))
match(CAST(NULL AS Nullable(String)),'')
match(CAST(NULL AS Nullable(String)),CAST(NULL AS Nullable(String)))
arrayStringConcat([CAST('\0' AS String)],CAST('\0' AS Nullable(String)))
arrayStringConcat([CAST('\0' AS String)],CAST(NULL AS Nullable(String)))
arrayStringConcat(arrayPopBack([CAST('\0' AS String)]),CAST('\0' AS Nullable(String)))
arrayStringConcat(arrayPopBack([CAST('\0' AS String)]),CAST(NULL AS Nullable(String)))
tupleElement(CAST(1 AS Int8),sumState(0))
notLike('',CAST('\0' AS Nullable(String)))
notLike('',CAST(NULL AS Nullable(String)))
notLike(CAST('\0' AS Nullable(String)),'')
notLike(CAST('\0' AS Nullable(String)),CAST('\0' AS Nullable(String)))
notLike(CAST('\0' AS Nullable(String)),CAST(NULL AS Nullable(String)))
or(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
or(CAST(1 AS Int8),CAST( 0 AS Nullable(UInt64)))
or(CAST(1 AS Int8),CAST( 0 AS Nullable(Date)))
or(CAST(1 AS Int8),CAST( 0 AS Nullable(DateTime)))
or(CAST(1 AS Int8),CAST( '0' AS Nullable(Enum8('0' = 0, 'z' = 1))))
or(CAST(1 AS Int8),CAST(NULL AS Nullable(Float64)))
or(CAST(1 AS Int8),CAST(NULL AS Nullable(Date)))
or(CAST(1 AS Int8),CAST(NULL AS Nullable(DateTime)))
or(CAST(1 AS Int64),CAST(NULL AS Nullable(DateTime)))
More monkeytest crashes:
positionCaseInsensitiveUTF8('',CAST('\0' AS Nullable(String)))
coalesce(CAST('\0' AS Nullable(String)),'')
less(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
and(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
visitParamExtractBool('',CAST('\0' AS Nullable(String)))
notEquals(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
plus(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
positionUTF8('',CAST('\0' AS Nullable(String)))
bitRotateRight(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
toFixedString('',CAST(9223372036854775807 as Int64))
arrayElement([CAST( 0 AS Int8)],CAST( 0 AS Nullable(Int8)))
position('',CAST('\0' AS Nullable(String)))
equals(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
bitTest(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
bitOr(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
least(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
bitRotateLeft(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
bitShiftLeft(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
bitTestAny(CAST(1 AS UInt8),CAST( 0 AS Nullable(UInt8)))
lessOrEquals(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
multiply(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
positionCaseInsensitive('',CAST('\0' AS Nullable(String)))
bitAnd(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
bitTestAll(CAST(1 AS UInt8),CAST( 0 AS Nullable(UInt8)))
divide(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
bitXor(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
modulo(CAST( 0 AS Nullable(Int8)),CAST(1 AS Int8))
minus(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
intDiv(CAST( 0 AS Nullable(Int8)),CAST(1 AS Int8))
visitParamExtractUInt('',CAST('\0' AS Nullable(String)))
visitParamExtractInt('',CAST('\0' AS Nullable(String)))
intDivOrZero(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
greatest(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
greater(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
ifNull(CAST('\0' AS Nullable(String)),'')
bitShiftRight(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
farmHash64(CAST( 0 AS Nullable(Int8)))
arrayReduce(sumState(0),CAST(1 AS Int8))
xor(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
metroHash64(CAST( 0 AS Nullable(Int8)))
runningDifference(CAST( 0 AS Nullable(Int8)))
greaterOrEquals(CAST(1 AS Int8),CAST( 0 AS Nullable(Int8)))
cityHash64(CAST( 0 AS Nullable(Int8)))
topK(arrayPopBack([CAST('\0' AS Nullable(FixedString(1)))]))
topKArray([ [ [1], [2] ], [ [3], [4]] ])
uniqUpToArray([CAST( 0 AS Int8)],arrayPopBack([CAST( 0 AS Int8)]))
uniqCombinedArray([CAST( 0 AS Int8)],arrayPopBack([CAST( 0 AS Int8)]))
uniqCombinedBiasCorrectedArray([CAST( 0 AS Int8)],arrayPopBack([CAST( 0 AS Int8)]))
uniqCombinedLinearCountingArray([CAST( 0 AS Int8)],arrayPopBack([CAST( 0 AS Int8)]))
uniqExactArray([CAST( 0 AS Int8)],arrayPopBack([CAST( 0 AS Int8)]))
COVAR_POPArray([CAST( 0 AS Int8)],arrayPopBack([CAST( 0 AS Int8)]))
COVAR_SAMPArray([CAST( 0 AS Int8)],arrayPopBack([CAST( 0 AS Int8)]))
medianTimingWeightedArray([CAST( 0 AS Int8)],arrayPopBack([CAST( 0 AS Int8)]))
quantilesDeterministicArray([CAST( 0 AS Int8)],arrayPopBack([CAST( 0 AS Int32)]))
Now all fixed in master.
Most helpful comment
Now all fixed in master.