Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix a problem with rowvalue UPDATE when the rowvalue is not the left-most and the RHS is a multi-column subquery. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | rowvalue |
Files: | files | file ages | folders |
SHA1: |
e149e6b93a9afb3d574309c0db60e221 |
User & Date: | drh 2016-08-23 18:30:10.697 |
Context
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) | |
17:30 | Fix an uninitialized variable in CASE expression code generation. (check-in: c8ffae05e1 user: drh tags: rowvalue) | |
Changes
Changes to src/expr.c.
︙ | ︙ | |||
1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 | ExprList *pList, /* List to which to append. Might be NULL */ IdList *pColumns, /* List of names of LHS of the assignment */ Expr *pExpr /* Vector expression to be appended. Might be NULL */ ){ sqlite3 *db = pParse->db; int n; int i; if( pColumns==0 ) goto vector_append_error; if( pExpr==0 ) goto vector_append_error; n = sqlite3ExprVectorSize(pExpr); if( pColumns->nId!=n ){ sqlite3ErrorMsg(pParse, "%d columns assigned %d values", pColumns->nId, n); goto vector_append_error; } for(i=0; i<n; i++){ Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i); pList = sqlite3ExprListAppend(pParse, pList, pSubExpr); if( pList ){ pList->a[pList->nExpr-1].zName = pColumns->a[i].zName; pColumns->a[i].zName = 0; } } if( pExpr->op==TK_SELECT ){ | > > | | | | 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 | ExprList *pList, /* List to which to append. Might be NULL */ IdList *pColumns, /* List of names of LHS of the assignment */ Expr *pExpr /* Vector expression to be appended. Might be NULL */ ){ sqlite3 *db = pParse->db; int n; int i; int iFirst = pList ? pList->nExpr : 0; if( pColumns==0 ) goto vector_append_error; if( pExpr==0 ) goto vector_append_error; n = sqlite3ExprVectorSize(pExpr); if( pColumns->nId!=n ){ sqlite3ErrorMsg(pParse, "%d columns assigned %d values", pColumns->nId, n); goto vector_append_error; } for(i=0; i<n; i++){ Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i); pList = sqlite3ExprListAppend(pParse, pList, pSubExpr); if( pList ){ assert( pList->nExpr==iFirst+i+1 ); pList->a[pList->nExpr-1].zName = pColumns->a[i].zName; pColumns->a[i].zName = 0; } } if( pExpr->op==TK_SELECT ){ if( pList && pList->a[iFirst].pExpr ){ assert( pList->a[iFirst].pExpr->op==TK_SELECT_COLUMN ); pList->a[iFirst].pExpr->pRight = pExpr; pExpr = 0; } } vector_append_error: sqlite3ExprDelete(db, pExpr); sqlite3IdListDelete(db, pColumns); |
︙ | ︙ |
Changes to test/rowvalue7.test.
︙ | ︙ | |||
39 40 41 42 43 44 45 | do_execsql_test 1.4 { UPDATE t1 SET (c) = 99 WHERE a=3; SELECT *,'|' FROM t1 ORDER BY a; } {1 2 11 22 | 3 4 99 55 | 5 6 55 66 |} do_execsql_test 1.5 { | | | 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | do_execsql_test 1.4 { UPDATE t1 SET (c) = 99 WHERE a=3; SELECT *,'|' FROM t1 ORDER BY a; } {1 2 11 22 | 3 4 99 55 | 5 6 55 66 |} do_execsql_test 1.5 { UPDATE t1 SET b = 8, (c,d) = (SELECT 123,456) WHERE a=3; SELECT *,'|' FROM t1 ORDER BY a; } {1 2 11 22 | 3 8 123 456 | 5 6 55 66 |} do_catchsql_test 2.1 { UPDATE t1 SET (c,d) = (SELECT x,y,z FROM t2 WHERE w=a); } {1 {2 columns assigned 3 values}} |
︙ | ︙ |