質問

私は、以下のクエリに極超音速DB(HSQLDB):

SELECT (CASE foo WHEN 'a' THEN 'bar' WHEN 'b' THEN 'biz' ....
        ELSE 'fin' END ) FROM MyTable LIMIT 1

場合の数"の場合"の条項を超える約1000人にとってのJava StackOverflowError によってスローされるJDBCドライバー org.hsqldb.jdbc.Util.sqlException().

このう部分:また破っ CASE 決ッ例100条項が続いて ELSE ( CASE foo WHEN ... ) END.でもこの書き換えを取得しま 正確に 動作と同じに!

と思いますか参考に限定1000その他のHSQLDBます。助かります!

役に立ちましたか?

解決

アナフィラキシー様も近く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:

場合にスローされるスタックオーバーフローが発生用recursesもっています。

うにしたものではないでしょうかその時のHSQLDBを解析し、 CASE 表現、 WHEN 期に追加レイヤー別のランタイムスタックを実際にそらく何層にも当たり WHEN).

いか類似のStackOverflowErrorした場合は、演算表現1,000レベルは入れ子のしるしをつけることになる。

上限1,000であろう変数によっては、実施のJava VMのバージョンのJava、プラットフォームまで、メモリの量、等られなかったり、文献でのHSQLDBの文書では、プラットフォーム固有の限界というのは内蔵のHSQLDB.

他のヒント

CASEステートメントを完全に削除します。

これらの1000個の値を使用してテーブルを作成し、そのテーブルに内部結合を行います。

ビルが言ったように、明らかなHSQLパーサーの設計を考えると、制限を削除することは不可能です。

制限を緩和する(つまり、制限を1000を超えるまで押し上げることで1000個のスイッチに到達できるようにする)という点では、2つのオプションがあります。

  1. アプリの実行時にVMのスタックサイズを増やします。 SunのHotspot VMを使用している場合は、たとえば-XX:ThreadStackSize = 1024は、デフォルトの512Kではなく、スレッドごとに1MBスタックを使用します。これにより、再帰の深さがより深くなります。
  2. コンストラクタThread(ThreadGroup、Runnable、String、long)によって作成されたスレッドで作業を実行できます。最後のパラメーターは要求されたスタックサイズです。これは機能する場合と機能しない場合があります。 Javadocを読んでいる場合、これは提案です。VMはこの要求を無視してもかまいません。 Hotspotが具体的に何をするかはわかりませんが、役に立つかもしれません。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top