Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Simplify the row value misuse error message. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | rowvalue |
Files: | files | file ages | folders |
SHA1: |
838c50a5bf46fd0340839d577fa28ba0 |
User & Date: | drh 2016-08-23 19:02:55.746 |
Context
2016-08-24
| ||
00:25 | Avoid a potential null-pointer dereference following an OOM. (check-in: 25f6ed8de4 user: drh tags: rowvalue) | |
2016-08-23
| ||
19:02 | Simplify the row value misuse error message. (check-in: 838c50a5bf user: drh tags: rowvalue) | |
18:30 | Fix a problem with rowvalue UPDATE when the rowvalue is not the left-most and the RHS is a multi-column subquery. (check-in: e149e6b93a user: drh tags: rowvalue) | |
Changes
Changes to src/expr.c.
︙ | ︙ | |||
513 514 515 516 517 518 519 | Expr *pRight = pExpr->pRight; int nLeft = sqlite3ExprVectorSize(pLeft); int nRight = sqlite3ExprVectorSize(pRight); /* Check that both sides of the comparison are vectors, and that ** both are the same length. */ if( nLeft!=nRight ){ | | | 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 | Expr *pRight = pExpr->pRight; int nLeft = sqlite3ExprVectorSize(pLeft); int nRight = sqlite3ExprVectorSize(pRight); /* Check that both sides of the comparison are vectors, and that ** both are the same length. */ if( nLeft!=nRight ){ sqlite3ErrorMsg(pParse, "row value misused"); }else{ int i; int regLeft = 0; int regRight = 0; u8 opx = op; int addrDone = sqlite3VdbeMakeLabel(v); |
︙ | ︙ | |||
2606 2607 2608 2609 2610 2611 2612 | sqlite3SubselectError(pParse, pIn->x.pSelect->pEList->nExpr, nVector); return 1; } }else if( nVector!=1 ){ if( (pIn->pLeft->flags & EP_xIsSelect) ){ sqlite3SubselectError(pParse, nVector, 1); }else{ | | | 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 | sqlite3SubselectError(pParse, pIn->x.pSelect->pEList->nExpr, nVector); return 1; } }else if( nVector!=1 ){ if( (pIn->pLeft->flags & EP_xIsSelect) ){ sqlite3SubselectError(pParse, nVector, 1); }else{ sqlite3ErrorMsg(pParse, "row value misused"); } return 1; } return 0; } #endif |
︙ | ︙ | |||
3771 3772 3773 3774 3775 3776 3777 | sqlite3VdbeAddOp1(v, OP_RealAffinity, target); } #endif break; } case TK_VECTOR: { | | | 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 | sqlite3VdbeAddOp1(v, OP_RealAffinity, target); } #endif break; } case TK_VECTOR: { sqlite3ErrorMsg(pParse, "row value misused"); break; } /* ** Form A: ** CASE x WHEN e1 THEN r1 WHEN e2 THEN r2 ... WHEN eN THEN rN ELSE y END ** |
︙ | ︙ |
Changes to test/rowvalue.test.
︙ | ︙ | |||
146 147 148 149 150 151 152 | SELECT c FROM hh WHERE +a = (SELECT 'abc' COLLATE nocase) AND b = (SELECT 1); } {i} do_execsql_test 6.5 { SELECT c FROM hh WHERE a = (SELECT 'abc') COLLATE nocase AND b = (SELECT 1); } {i ii} do_catchsql_test 6.6 { SELECT c FROM hh WHERE (a, b) = (SELECT 'abc', 1) COLLATE nocase; | | | | 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | SELECT c FROM hh WHERE +a = (SELECT 'abc' COLLATE nocase) AND b = (SELECT 1); } {i} do_execsql_test 6.5 { SELECT c FROM hh WHERE a = (SELECT 'abc') COLLATE nocase AND b = (SELECT 1); } {i ii} do_catchsql_test 6.6 { SELECT c FROM hh WHERE (a, b) = (SELECT 'abc', 1) COLLATE nocase; } {1 {row value misused}} do_catchsql_test 6.7 { SELECT c FROM hh WHERE (a, b) = 1; } {1 {row value misused}} do_execsql_test 6.8 { SELECT c FROM hh WHERE (a COLLATE nocase, b) = (SELECT 'def', 2); } {iii iv} do_execsql_test 6.9 { SELECT c FROM hh WHERE (a COLLATE nocase, b) IS NOT (SELECT 'def', 2); } {i ii v vi} do_execsql_test 6.10 { |
︙ | ︙ | |||
217 218 219 220 221 222 223 | 4 "(a, b) < (4, 3)" {1 2 3} } { do_execsql_test 9.$tn "SELECT c FROM t2 WHERE $q" $res } finish_test | < | 217 218 219 220 221 222 223 | 4 "(a, b) < (4, 3)" {1 2 3} } { do_execsql_test 9.$tn "SELECT c FROM t2 WHERE $q" $res } finish_test |
Changes to test/rowvalue3.test.
︙ | ︙ | |||
200 201 202 203 204 205 206 | } } #------------------------------------------------------------------------- finish_test | < < | 200 201 202 203 204 205 206 | } } #------------------------------------------------------------------------- finish_test |
Changes to test/rowvalue4.test.
︙ | ︙ | |||
30 31 32 33 34 35 36 | } foreach {tn e} { 1 "(1, 2, 3)" 2 "1 + (1, 2)" 3 "(1,2,3) == (1, 2)" } { | | | | | | | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | } foreach {tn e} { 1 "(1, 2, 3)" 2 "1 + (1, 2)" 3 "(1,2,3) == (1, 2)" } { do_catchsql_test 1.$tn "SELECT $e" {1 {row value misused}} } foreach {tn s error} { 1 "SELECT * FROM t1 WHERE a = (1, 2)" {row value misused} 2 "SELECT * FROM t1 WHERE b = (1, 2)" {row value misused} 3 "SELECT * FROM t1 WHERE NOT (b = (1, 2))" {row value misused} 4 "SELECT * FROM t1 LIMIT (1, 2)" {row value misused} 5 "SELECT (a, b) IN (SELECT * FROM t1) FROM t1" {sub-select returns 3 columns - expected 2} 6 "SELECT * FROM t1 WHERE (a, b) IN (SELECT * FROM t1)" {sub-select returns 3 columns - expected 2} } { do_catchsql_test 2.$tn "$s" [list 1 $error] |
︙ | ︙ | |||
305 306 307 308 309 310 311 | do_catchsql_test 8.2 { SELECT * FROM c2 CROSS JOIN c3 WHERE ( (a, b) == (SELECT x, y FROM c1) AND c3.d = c ) OR ( c == (SELECT x, y FROM c1) AND c3.d = c ) } {1 {sub-select returns 2 columns - expected 1}} finish_test | < | 305 306 307 308 309 310 311 | do_catchsql_test 8.2 { SELECT * FROM c2 CROSS JOIN c3 WHERE ( (a, b) == (SELECT x, y FROM c1) AND c3.d = c ) OR ( c == (SELECT x, y FROM c1) AND c3.d = c ) } {1 {sub-select returns 2 columns - expected 1}} finish_test |
Changes to test/rowvalue5.test.
︙ | ︙ | |||
106 107 108 109 110 111 112 | 15 "(a, b) <= ('a', 'b')" {{a <= 'a'}} 16 "(a, b) < ('a', 'b')" {} } { do_execsql_test 1.$tn "SELECT expr FROM x1 WHERE $where" $res } finish_test | < | 106 107 108 109 110 111 112 | 15 "(a, b) <= ('a', 'b')" {{a <= 'a'}} 16 "(a, b) < ('a', 'b')" {} } { do_execsql_test 1.$tn "SELECT expr FROM x1 WHERE $where" $res } finish_test |