aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2018-04-12 21:42:51 +0000
committerdrh <drh@noemail.net>2018-04-12 21:42:51 +0000
commitfcfd756fe32920c6495b1ae9c2092cc73c2fbcb1 (patch)
tree84f9b8c7b64adc14f6644288221884ebbac49002 /src
parent4357e226374ff84899f9297d335fc81d9171f2df (diff)
downloadsqlite-fcfd756fe32920c6495b1ae9c2092cc73c2fbcb1.tar.gz
sqlite-fcfd756fe32920c6495b1ae9c2092cc73c2fbcb1.zip
Break out the upsert code into a separate source file.
FossilOrigin-Name: 389806b05f163687d8eb858b0f87f9a2d02e90af9f2097924a66715f05177613
Diffstat (limited to 'src')
-rw-r--r--src/build.c60
-rw-r--r--src/upsert.c72
2 files changed, 72 insertions, 60 deletions
diff --git a/src/build.c b/src/build.c
index 2b3c8a1cf..c286b4bbe 100644
--- a/src/build.c
+++ b/src/build.c
@@ -4473,63 +4473,3 @@ void sqlite3WithDelete(sqlite3 *db, With *pWith){
}
}
#endif /* !defined(SQLITE_OMIT_CTE) */
-
-#ifndef SQLITE_OMIT_UPSERT
-/*
-** Free a list of Upsert objects
-*/
-void sqlite3UpsertDelete(sqlite3 *db, Upsert *p){
- while( p ){
- Upsert *pNext = p->pUpsertNext;
- sqlite3ExprListDelete(db, p->pUpsertTarget);
- sqlite3ExprListDelete(db, p->pUpsertSet);
- sqlite3ExprDelete(db, p->pUpsertWhere);
- sqlite3DbFree(db, p);
- p = pNext;
- }
-}
-#endif /* SQLITE_OMIT_UPSERT */
-
-#ifndef SQLITE_OMIT_UPSERT
-/*
-** Duplicate an Upsert object.
-*/
-Upsert *sqlite3UpsertDup(sqlite3 *db, Upsert *p){
- if( p==0 ) return 0;
- return sqlite3UpsertNew(db,
- sqlite3UpsertDup(db, p->pUpsertNext),
- sqlite3ExprListDup(db, p->pUpsertTarget, 0),
- sqlite3ExprListDup(db, p->pUpsertSet, 0),
- sqlite3ExprDup(db, p->pUpsertWhere, 0)
- );
-}
-#endif /* SQLITE_OMIT_UPSERT */
-
-#ifndef SQLITE_OMIT_UPSERT
-/*
-** Create a new Upsert object.
-*/
-Upsert *sqlite3UpsertNew(
- sqlite3 *db, /* Determines which memory allocator to use */
- Upsert *pPrior, /* Append this upsert to the end of the new one */
- ExprList *pTarget, /* Target argument to ON CONFLICT, or NULL */
- ExprList *pSet, /* UPDATE columns, or NULL for a DO NOTHING */
- Expr *pWhere /* WHERE clause for the ON CONFLICT UPDATE */
-){
- Upsert *pNew;
- pNew = sqlite3DbMallocRaw(db, sizeof(Upsert));
- if( pNew==0 ){
- sqlite3UpsertDelete(db, pPrior);
- sqlite3ExprListDelete(db, pTarget);
- sqlite3ExprListDelete(db, pSet);
- sqlite3ExprDelete(db, pWhere);
- return 0;
- }else{
- pNew->pUpsertTarget = pTarget;
- pNew->pUpsertSet = pSet;
- pNew->pUpsertNext = pPrior;
- pNew->pUpsertWhere = pWhere;
- }
- return pNew;
-}
-#endif /* SQLITE_OMIT_UPSERT */
diff --git a/src/upsert.c b/src/upsert.c
new file mode 100644
index 000000000..b42ef06a1
--- /dev/null
+++ b/src/upsert.c
@@ -0,0 +1,72 @@
+/*
+** 2018-04-12
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file contains code to implement various aspects of UPSERT
+** processing and handling of the Upsert object.
+*/
+#include "sqliteInt.h"
+
+#ifndef SQLITE_OMIT_UPSERT
+/*
+** Free a list of Upsert objects
+*/
+void sqlite3UpsertDelete(sqlite3 *db, Upsert *p){
+ while( p ){
+ Upsert *pNext = p->pUpsertNext;
+ sqlite3ExprListDelete(db, p->pUpsertTarget);
+ sqlite3ExprListDelete(db, p->pUpsertSet);
+ sqlite3ExprDelete(db, p->pUpsertWhere);
+ sqlite3DbFree(db, p);
+ p = pNext;
+ }
+}
+
+/*
+** Duplicate an Upsert object.
+*/
+Upsert *sqlite3UpsertDup(sqlite3 *db, Upsert *p){
+ if( p==0 ) return 0;
+ return sqlite3UpsertNew(db,
+ sqlite3UpsertDup(db, p->pUpsertNext),
+ sqlite3ExprListDup(db, p->pUpsertTarget, 0),
+ sqlite3ExprListDup(db, p->pUpsertSet, 0),
+ sqlite3ExprDup(db, p->pUpsertWhere, 0)
+ );
+}
+
+/*
+** Create a new Upsert object.
+*/
+Upsert *sqlite3UpsertNew(
+ sqlite3 *db, /* Determines which memory allocator to use */
+ Upsert *pPrior, /* Append this upsert to the end of the new one */
+ ExprList *pTarget, /* Target argument to ON CONFLICT, or NULL */
+ ExprList *pSet, /* UPDATE columns, or NULL for a DO NOTHING */
+ Expr *pWhere /* WHERE clause for the ON CONFLICT UPDATE */
+){
+ Upsert *pNew;
+ pNew = sqlite3DbMallocRaw(db, sizeof(Upsert));
+ if( pNew==0 ){
+ sqlite3UpsertDelete(db, pPrior);
+ sqlite3ExprListDelete(db, pTarget);
+ sqlite3ExprListDelete(db, pSet);
+ sqlite3ExprDelete(db, pWhere);
+ return 0;
+ }else{
+ pNew->pUpsertTarget = pTarget;
+ pNew->pUpsertSet = pSet;
+ pNew->pUpsertNext = pPrior;
+ pNew->pUpsertWhere = pWhere;
+ }
+ return pNew;
+}
+
+#endif /* SQLITE_OMIT_UPSERT */