Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Remove unreachable branches. 100% MC/DC in TH3 now. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | upsert |
Files: | files | file ages | folders |
SHA3-256: |
558865d5c3c297155e1be5ea73effb46 |
User & Date: | drh 2018-04-17 21:59:34.011 |
Context
2018-04-18
| ||
01:34 | Add new testcase() macros and fix a bug that was revealed when trying to cover all the new test cases. (check-in: 266a99f7c0 user: drh tags: upsert) | |
2018-04-17
| ||
21:59 | Remove unreachable branches. 100% MC/DC in TH3 now. (check-in: 558865d5c3 user: drh tags: upsert) | |
20:09 | Added a comment on the assert() added to the previous check-in. (check-in: 542547c1ce user: drh tags: upsert) | |
Changes
Changes to src/parse.y.
︙ | ︙ | |||
860 861 862 863 864 865 866 | // cmd ::= with insert_cmd(R) INTO fullname(X) idlist_opt(F) select(S) upsert(U). { sqlite3Insert(pParse, X, S, F, R, U); } cmd ::= with insert_cmd(R) INTO fullname(X) idlist_opt(F) AS nm(A) select(S) upsert(U). { | > > > | > > > > > | | 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 | // cmd ::= with insert_cmd(R) INTO fullname(X) idlist_opt(F) select(S) upsert(U). { sqlite3Insert(pParse, X, S, F, R, U); } cmd ::= with insert_cmd(R) INTO fullname(X) idlist_opt(F) AS nm(A) select(S) upsert(U). { /* X could only be NULL following a OOM, but an OOM would have been detected ** and stopped the parse long before this rule reduces. */ assert( X!=0 ); X->a[0].zAlias = sqlite3NameFromToken(pParse->db, &A); sqlite3Insert(pParse, X, S, F, R, U); } cmd ::= with insert_cmd(R) INTO fullname(X) idlist_opt(F) DEFAULT VALUES. { sqlite3Insert(pParse, X, 0, F, R, 0); } %type upsert {Upsert*} // Because upsert only occurs at the tip end of the INSERT rule for cmd, // there is never a case where the value of the upsert pointer will not // be destroyed by the cmd action. So comment-out the destructor to // avoid unreachable code. //%destructor upsert {sqlite3UpsertDelete(pParse->db,$$);} upsert(A) ::= . { A = 0; } upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW) DO UPDATE SET setlist(Z) where_opt(W). { A = sqlite3UpsertNew(pParse->db,T,TW,Z,W);} upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW) DO NOTHING. { A = sqlite3UpsertNew(pParse->db,T,TW,0,0); } upsert(A) ::= ON CONFLICT DO NOTHING. |
︙ | ︙ |
Changes to src/upsert.c.
︙ | ︙ | |||
110 111 112 113 114 115 116 | /* Check to see if the conflict target matches the rowid. */ pTab = pTabList->a[0].pTab; pTarget = pUpsert->pUpsertTarget; iCursor = pTabList->a[0].iCursor; if( HasRowid(pTab) && pTarget->nExpr==1 && (pTerm = pTarget->a[0].pExpr)->op==TK_COLUMN | | | 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | /* Check to see if the conflict target matches the rowid. */ pTab = pTabList->a[0].pTab; pTarget = pUpsert->pUpsertTarget; iCursor = pTabList->a[0].iCursor; if( HasRowid(pTab) && pTarget->nExpr==1 && (pTerm = pTarget->a[0].pExpr)->op==TK_COLUMN && pTerm->iColumn==XN_ROWID ){ /* The conflict-target is the rowid of the primary table */ assert( pUpsert->pUpsertIdx==0 ); return SQLITE_OK; } /* Initialize sCol[0..1] to be an expression parse tree for a |
︙ | ︙ |