Вы никогда не должны приближаться к 1000 терминам в выражении CASE
. Задолго до этого вы должны поместить другие значения в отдельную таблицу и выбрать их, присоединившись.
INSERT INTO MappingTable (foo, string) VALUES
('a', 'bar'), ('b', 'biz'), ...
SELECT COALESCE(m.string, 'fin')
FROM MyTable t LEFT OUTER JOIN MappingTable m USING (foo)
LIMIT 1;
Java API говорит о StackOverflowError:
Брошенный, когда переполнение стека происходит, потому что приложение рекурсивно слишком глубоко.
Так что я бы предположил, что когда HSQLDB анализирует выражение CASE
, каждый член WHEN
добавляет еще один слой в стек времени выполнения (на самом деле, вероятно, несколько слоев на WHEN
).
Вероятно, вы получите похожее StackOverflowError, если у вас будет арифметическое выражение с 1000 уровнями вложенных скобок.
Предел 1000, вероятно, является переменной величиной, в зависимости от реализации виртуальной машины Java, версии Java, платформы, на которой вы работаете, объема доступной памяти и т. Д. Они могут не документироваться в документации HSQLDB. потому что это предел для конкретной платформы, а не что-то встроенное в HSQLDB.