2 ** This utility program decodes and displays the content of the
3 ** sqlite_stat4 table in the database file named on the command
12 typedef sqlite3_int64 i64
; /* 64-bit signed integer type */
16 ** Convert the var-int format into i64. Return the number of bytes
17 ** in the var-int. Write the var-int value into *pVal.
19 static int decodeVarint(const unsigned char *z
, i64
*pVal
){
23 v
= (v
<<7) + (z
[i
]&0x7f);
24 if( (z
[i
]&0x80)==0 ){ *pVal
= v
; return i
+1; }
26 v
= (v
<<8) + (z
[i
]&0xff);
33 int main(int argc
, char **argv
){
37 int rc
, j
, x
, y
, mxHdr
;
38 const unsigned char *aSample
;
44 fprintf(stderr
, "Usage: %s DATABASE-FILE\n", argv
[0]);
47 rc
= sqlite3_open(argv
[1], &db
);
48 if( rc
!=SQLITE_OK
|| db
==0 ){
49 fprintf(stderr
, "Cannot open database file [%s]\n", argv
[1]);
52 rc
= sqlite3_prepare_v2(db
,
53 "SELECT tbl||'.'||idx, nEq, nLT, nDLt, sample "
54 "FROM sqlite_stat4 ORDER BY 1", -1,
56 if( rc
!=SQLITE_OK
|| pStmt
==0 ){
57 fprintf(stderr
, "%s\n", sqlite3_errmsg(db
));
61 while( SQLITE_ROW
==sqlite3_step(pStmt
) ){
62 if( zIdx
==0 || strcmp(zIdx
, (const char*)sqlite3_column_text(pStmt
,0))!=0 ){
63 if( zIdx
) printf("\n");
65 zIdx
= sqlite3_mprintf("%s", sqlite3_column_text(pStmt
,0));
66 printf("%s:\n", zIdx
);
68 printf(" -----------------------------------------------------------\n");
70 printf(" nEq = %s\n", sqlite3_column_text(pStmt
,1));
71 printf(" nLt = %s\n", sqlite3_column_text(pStmt
,2));
72 printf(" nDLt = %s\n", sqlite3_column_text(pStmt
,3));
73 printf(" sample = x'");
74 aSample
= sqlite3_column_blob(pStmt
,4);
75 nSample
= sqlite3_column_bytes(pStmt
,4);
76 for(j
=0; j
<nSample
; j
++) printf("%02x", aSample
[j
]);
79 x
= decodeVarint(aSample
, &iVal
);
80 if( iVal
<x
|| iVal
>nSample
){
84 y
= mxHdr
= (int)iVal
;
88 x
+= decodeVarint(aSample
+x
, &iVal
);
92 case 0: sz
= 0; break;
93 case 1: sz
= 1; break;
94 case 2: sz
= 2; break;
95 case 3: sz
= 3; break;
96 case 4: sz
= 4; break;
97 case 5: sz
= 6; break;
98 case 6: sz
= 8; break;
99 case 7: sz
= 8; break;
100 case 8: sz
= 0; break;
101 case 9: sz
= 0; break;
103 case 11: sz
= 0; break;
104 default: sz
= (int)(iVal
-12)/2; break;
106 if( y
+sz
>nSample
) break;
108 printf("%sNULL", zSep
);
109 }else if( iVal
==8 || iVal
==9 ){
110 printf("%s%d", zSep
, ((int)iVal
)-8);
112 v
= (signed char)aSample
[y
];
114 v
= (v
<<8) + aSample
[y
+j
];
118 memcpy(&r
, &v
, sizeof(r
));
119 printf("%s%#g", zSep
, r
);
121 printf("%s%lld", zSep
, v
);
123 }else if( (iVal
&1)==0 ){
124 printf("%sx'", zSep
);
126 printf("%02x", aSample
[y
+j
]);
130 printf("%s\"", zSep
);
132 char c
= (char)aSample
[y
+j
];
134 if( c
=='"' || c
=='\\' ) putchar('\\');
154 sqlite3_finalize(pStmt
);