mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-24 11:34:21 +01:00
There's two forms of case: CASE (WHEN [bool expr] THEN [value])+ (ELSE [value])? END which checks a series of boolean conditions, and: CASE expr (WHEN [expr] THEN [value})+ (ELSE [value])? END Which checks a series of equality conditions. This implements support for both. Note that the ELSE is optional, and will be equivalent to `ELSE null` if not specified. sqlite3 gives the implementation as: sqlite> explain select case a WHEN a THEN b WHEN c THEN d ELSE 0 END from casetest; addr opcode p1 p2 p3 p4 p5 comment ---- ------------- ---- ---- ---- ------------- -- ------------- 0 Init 0 16 0 0 Start at 16 1 OpenRead 0 3 0 4 0 root=3 iDb=0; casetest 2 Rewind 0 15 0 0 3 Column 0 0 2 0 r[2]= cursor 0 column 0 4 Column 0 0 3 0 r[3]= cursor 0 column 0 5 Ne 3 8 2 BINARY-8 83 if r[2]!=r[3] goto 8 6 Column 0 1 1 0 r[1]= cursor 0 column 1 7 Goto 0 13 0 0 8 Column 0 2 3 0 r[3]= cursor 0 column 2 9 Ne 3 12 2 BINARY-8 83 if r[2]!=r[3] goto 12 10 Column 0 3 1 0 r[1]= cursor 0 column 3 11 Goto 0 13 0 0 12 Integer 0 1 0 0 r[1]=0 13 ResultRow 1 1 0 0 output=r[1] 14 Next 0 3 0 1 15 Halt 0 0 0 0 16 Transaction 0 0 2 0 1 usesStmtJournal=0 17 Goto 0 1 0 0 and after this patch, limbo gives: addr opcode p1 p2 p3 p4 p5 comment ---- ----------------- ---- ---- ---- ------------- -- ------- 0 Init 0 18 0 0 Start at 18 1 OpenReadAsync 0 4 0 0 table=casetest, root=4 2 OpenReadAwait 0 0 0 0 3 RewindAsync 0 0 0 0 4 RewindAwait 0 17 0 0 Rewind table casetest 5 Column 0 0 2 0 r[2]=casetest.a 6 Column 0 0 3 0 r[3]=casetest.a 7 Ne 2 3 10 0 if r[2]!=r[3] goto 10 8 Column 0 1 1 0 r[1]=casetest.b 9 Goto 0 14 0 0 10 Column 0 2 3 0 r[3]=casetest.c 11 Ne 2 3 14 0 if r[2]!=r[3] goto 14 12 Column 0 3 1 0 r[1]=casetest.d 13 Goto 0 14 0 0 14 ResultRow 1 1 0 0 output=r[1] 15 NextAsync 0 0 0 0 16 NextAwait 0 5 0 0 17 Halt 0 0 0 0 18 Transaction 0 0 0 0 19 Integer 0 1 0 0 r[1]=0 20 Goto 0 1 0 0 And then as there's nowhere to annotate this new support in COMPAT.md, I added a corresponding heading for SELECT expressions and what is/isn't supported.