1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-12 13:01:09 +03:00

Add new diagnostic "sqlite3TreeView" routines for IdList, Upsert, and for

INSERT statements.  This is all debugging code.  There are no changes to
release builds.

FossilOrigin-Name: f3084122039bcb30c8617f5f432009a49be8b488235850a1f10ef862c91560b2
This commit is contained in:
drh
2022-04-06 00:29:21 +00:00
parent ec534e6a23
commit 7d2c1d24b0
5 changed files with 146 additions and 10 deletions

View File

@@ -95,7 +95,7 @@ void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 moreToFollow){
sqlite3TreeViewLine(pView, "WITH (0x%p)", pWith);
}
if( pWith->nCte>0 ){
pView = sqlite3TreeViewPush(pView, 1);
pView = sqlite3TreeViewPush(pView, moreToFollow);
for(i=0; i<pWith->nCte; i++){
StrAccum x;
char zLine[1000];
@@ -814,4 +814,127 @@ void sqlite3TreeViewExprList(
sqlite3TreeViewPop(pView);
}
/*
** Generate a human-readable explanation of an id-list.
*/
void sqlite3TreeViewBareIdList(
TreeView *pView,
const IdList *pList,
const char *zLabel
){
if( zLabel==0 || zLabel[0]==0 ) zLabel = "LIST";
if( pList==0 ){
sqlite3TreeViewLine(pView, "%s (empty)", zLabel);
}else{
int i;
sqlite3TreeViewLine(pView, "%s", zLabel);
for(i=0; i<pList->nId; i++){
char *zName = pList->a[i].zName;
int moreToFollow = i<pList->nId - 1;
if( zName==0 ) zName = "(null)";
sqlite3TreeViewPush(pView, moreToFollow);
moreToFollow = 0;
sqlite3TreeViewLine(pView, 0);
fprintf(stdout, "%s (%d)\n", zName, pList->a[i].idx);
sqlite3TreeViewPop(pView);
}
}
}
void sqlite3TreeViewIdList(
TreeView *pView,
const IdList *pList,
u8 moreToFollow,
const char *zLabel
){
pView = sqlite3TreeViewPush(pView, moreToFollow);
sqlite3TreeViewBareIdList(pView, pList, zLabel);
sqlite3TreeViewPop(pView);
}
/*
** Generate a human-readable explanation of a list of Upsert objects
*/
void sqlite3TreeViewUpsert(
TreeView *pView,
const Upsert *pUpsert,
u8 moreToFollow
){
if( pUpsert==0 ) return;
pView = sqlite3TreeViewPush(pView, moreToFollow);
while( pUpsert ){
int n;
sqlite3TreeViewPush(pView, pUpsert->pNextUpsert!=0 || moreToFollow);
sqlite3TreeViewLine(pView, "ON CONFLICT DO %s",
pUpsert->isDoUpdate ? "UPDATE" : "NOTHING");
n = (pUpsert->pUpsertSet!=0) + (pUpsert->pUpsertWhere!=0);
sqlite3TreeViewExprList(pView, pUpsert->pUpsertTarget, (n--)>0, "TARGET");
sqlite3TreeViewExprList(pView, pUpsert->pUpsertSet, (n--)>0, "SET");
if( pUpsert->pUpsertWhere ){
sqlite3TreeViewItem(pView, "WHERE", (n--)>0);
sqlite3TreeViewExpr(pView, pUpsert->pUpsertWhere, 0);
sqlite3TreeViewPop(pView);
}
sqlite3TreeViewPop(pView);
pUpsert = pUpsert->pNextUpsert;
}
sqlite3TreeViewPop(pView);
}
/*
** Generate a human-readable diagram of the data structure that go
** into generating an INSERT statement.
*/
void sqlite3TreeViewInsert(
TreeView *pView,
const With *pWith,
const SrcList *pTabList,
const IdList *pColumnList,
const Select *pSelect,
int onError,
const Upsert *pUpsert
){
int n = 0;
const char *zLabel = "INSERT";
switch( onError ){
case OE_Replace: zLabel = "REPLACE"; break;
case OE_Ignore: zLabel = "INSERT OR IGNORE"; break;
case OE_Rollback: zLabel = "INSERT OR ROLLBACK"; break;
case OE_Abort: zLabel = "INSERT OR ABORT"; break;
case OE_Fail: zLabel = "INSERT OR FAIL"; break;
}
sqlite3TreeViewLine(pView, zLabel);
pView = sqlite3TreeViewPush(pView, 0);
if( pWith ) n++;
if( pTabList ) n++;
if( pColumnList ) n++;
if( pSelect ) n++;
if( pUpsert ) n++;
if( pWith ){
pView = sqlite3TreeViewPush(pView, (--n)>0);
sqlite3TreeViewWith(pView, pWith, 0);
sqlite3TreeViewPop(pView);
}
if( pTabList ){
pView = sqlite3TreeViewPush(pView, (--n)>0);
sqlite3TreeViewLine(pView, "INTO");
sqlite3TreeViewSrcList(pView, pTabList);
sqlite3TreeViewPop(pView);
}
if( pColumnList ){
sqlite3TreeViewIdList(pView, pColumnList, (--n)>0, "COLUMNS");
}
if( pSelect ){
pView = sqlite3TreeViewPush(pView, (--n)>0);
sqlite3TreeViewLine(pView, "DATA-SOURCE");
sqlite3TreeViewSelect(pView, pSelect, 0);
sqlite3TreeViewPop(pView);
}
if( pUpsert ){
pView = sqlite3TreeViewPush(pView, (--n)>0);
sqlite3TreeViewLine(pView, "UPSERT");
sqlite3TreeViewUpsert(pView, pUpsert, 0);
sqlite3TreeViewPop(pView);
}
}
#endif /* SQLITE_DEBUG */