Apache Calcite выдает ошибку при использовании COALESCE только с нетипизированными нулями - PullRequest
0 голосов
/ 21 января 2019

При запуске SELECT COALESCE(NULL, NULL); в Apache Calcite я получаю сообщение об ошибке,

.

Предложение ELSE или хотя бы одно предложение THEN должно быть ненулевым

Это происходит потому, что функция COALESCE преобразуется в выражение CASE, и последнее проверяется на то, является ли хотя бы один операнд THEN или ELSE не нулевым. Если все NULL, то выдается ошибка. Это мотивировано причинами, описанными в комментарии , найденном в исходном коде:

в соответствии со стандартом sql мы не можем иметь все операторы THEN и ELSE, возвращающие ноль

Следует отметить, что этот запрос возвращает NULL, когда какой-либо из параметров явно приведен, например, SELECT COALESCE(CAST(NULL AS VARCHAR), NULL);.

Однако я нигде не мог найти это. То, что я нашел, это после (см. 'Сокращения, чтобы справиться с нулевым' разделом, подчеркивание мое):

Coalesce возвращает первый ненулевой параметр ( или ноль, если все параметры нулевые ).

Это утверждение, приведенное выше, похоже, соответствует Oracle и PostreSQL docs.

У меня вопрос: должен ли COALESCE, содержащий буквенные NULL s, работать только в соответствии со стандартом SQL?

1 Ответ

0 голосов
/ 21 января 2019

Это слишком долго для комментария.

То, должно ли что-либо работать только в соответствии со стандартом SQL, может быть предметом академических дискуссий, но это просто не то, как работают базы данных.Насколько я знаю, каждая база данных имеет свои причуды, расширения и исключения из стандарта.Это просто факт того, что разные поставщики предоставляют такой язык.

В большинстве языков я думаю, что нетипизированный NULL заканчивается типом по умолчанию.Я определяю, что это такое, сохраняя select NULL в таблице (используя любой метод, используемый для этой базы данных) и просматривая тип.

...