better debug logs for xBestIndex

This commit is contained in:
Colin Dellow 2018-03-08 13:21:33 -05:00
parent 2d616c54fb
commit 824a416f51
4 changed files with 64 additions and 8 deletions

View File

@ -21,4 +21,4 @@ create virtual table parquet using parquet('/home/cldellow/src/csv2parquet/12m.p
--select sum(col0) from parquet limit 1; --select sum(col0) from parquet limit 1;
--select * from parquet limit 10; --select * from parquet limit 10;
--select sum(length(col3)) from parquet; --select sum(length(col3)) from parquet;
select * from parquet where (col3 = 'Dawson Creeks') or col9 LIKE '%Bicycqq%' limit 20000; select * from parquet where rowid = 123 or (col3 = 'Dawson Creeks') or col9 LIKE '%Bicycqq%' limit 20000;

View File

@ -143,6 +143,40 @@ static int parquetOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
return SQLITE_OK; return SQLITE_OK;
} }
const char* opName(int op) {
switch(op) {
case SQLITE_INDEX_CONSTRAINT_EQ:
return "=";
case SQLITE_INDEX_CONSTRAINT_GT:
return ">";
case SQLITE_INDEX_CONSTRAINT_LE:
return "<=";
case SQLITE_INDEX_CONSTRAINT_LT:
return "<";
case SQLITE_INDEX_CONSTRAINT_GE:
return ">=";
case SQLITE_INDEX_CONSTRAINT_MATCH:
return "match";
case SQLITE_INDEX_CONSTRAINT_LIKE:
return "LIKE";
case SQLITE_INDEX_CONSTRAINT_GLOB:
return "GLOB";
case SQLITE_INDEX_CONSTRAINT_REGEXP:
return "REGEXP";
case SQLITE_INDEX_CONSTRAINT_NE:
return "!=";
case SQLITE_INDEX_CONSTRAINT_ISNOT:
return "IS NOT";
case SQLITE_INDEX_CONSTRAINT_ISNOTNULL:
return "IS NOT NULL";
case SQLITE_INDEX_CONSTRAINT_ISNULL:
return "IS NULL";
case SQLITE_INDEX_CONSTRAINT_IS:
return "IS";
default:
return "unknown";
}
}
/* /*
** Advance a sqlite3_vtab_cursor_parquet to its next row of input. ** Advance a sqlite3_vtab_cursor_parquet to its next row of input.
@ -249,10 +283,14 @@ static int parquetEof(sqlite3_vtab_cursor *cur){
*/ */
static int parquetFilter( static int parquetFilter(
sqlite3_vtab_cursor *cur, sqlite3_vtab_cursor *cur,
int idxNum, const char *idxStr, int idxNum,
int argc, sqlite3_value **argv const char *idxStr,
int argc,
sqlite3_value **argv
){ ){
printf("xFilter: idxNum=%d\n", idxNum); printf("xFilter: idxNum=%d, idxStr=%lu, argc=%d\n", idxNum, (long unsigned int)idxStr, argc);
const unsigned char* needle = sqlite3_value_text(argv[0]);
printf(" ...%s\n", needle);
ParquetCursor* cursor = ((sqlite3_vtab_cursor_parquet*)cur)->cursor; ParquetCursor* cursor = ((sqlite3_vtab_cursor_parquet*)cur)->cursor;
cursor->reset(); cursor->reset();
return parquetNext(cur); return parquetNext(cur);
@ -266,17 +304,21 @@ static int parquetBestIndex(
sqlite3_vtab *tab, sqlite3_vtab *tab,
sqlite3_index_info *pIdxInfo sqlite3_index_info *pIdxInfo
){ ){
ParquetTable* table = ((sqlite3_vtab_parquet*)tab)->table;
printf("xBestIndex: nConstraint=%d, nOrderBy=%d\n", pIdxInfo->nConstraint, pIdxInfo->nOrderBy); printf("xBestIndex: nConstraint=%d, nOrderBy=%d\n", pIdxInfo->nConstraint, pIdxInfo->nOrderBy);
// Duplicate pIdxInfo and stash it in pIdxInfo->idxStr. // Duplicate pIdxInfo and stash it in pIdxInfo->idxStr.
for(int i = 0; i < pIdxInfo->nConstraint; i++) { for(int i = 0; i < pIdxInfo->nConstraint; i++) {
printf(" constraint %d: col %d, op %d, usable %d\n", printf(" constraint %d: col %d[%s], op %d[%s], usable %d\n",
i, i,
pIdxInfo->aConstraint[i].iColumn, pIdxInfo->aConstraint[i].iColumn,
table->columnName(pIdxInfo->aConstraint[i].iColumn).data(),
pIdxInfo->aConstraint[i].op, pIdxInfo->aConstraint[i].op,
opName(pIdxInfo->aConstraint[i].op),
pIdxInfo->aConstraint[i].usable); pIdxInfo->aConstraint[i].usable);
} }
if(true || (pIdxInfo->nConstraint == 0 && pIdxInfo->nOrderBy == 0)) { if((pIdxInfo->nConstraint == 0 && pIdxInfo->nOrderBy == 0)) {
pIdxInfo->estimatedCost = 1000000000000; pIdxInfo->estimatedCost = 1000000000000;
pIdxInfo->idxNum = 0; pIdxInfo->idxNum = 0;
pIdxInfo->estimatedRows = 10000; pIdxInfo->estimatedRows = 10000;

View File

@ -6,11 +6,22 @@ ParquetTable::ParquetTable(std::string file) {
this->file = file; this->file = file;
} }
std::string ParquetTable::columnName(int i) {
if(i == -1)
return "rowid";
return columnNames[i];
}
std::string ParquetTable::CreateStatement() { std::string ParquetTable::CreateStatement() {
std::unique_ptr<parquet::ParquetFileReader> reader = parquet::ParquetFileReader::OpenFile(file.data()); std::unique_ptr<parquet::ParquetFileReader> reader = parquet::ParquetFileReader::OpenFile(file.data());
// TODO: parse columns from file
std::string text("CREATE TABLE x("); std::string text("CREATE TABLE x(");
auto schema = reader->metadata()->schema(); auto schema = reader->metadata()->schema();
for(auto i = 0; i < schema->num_columns(); i++) {
auto _col = schema->GetColumnRoot(i);
columnNames.push_back(_col->name());
}
for(auto i = 0; i < schema->num_columns(); i++) { for(auto i = 0; i < schema->num_columns(); i++) {
auto _col = schema->GetColumnRoot(i); auto _col = schema->GetColumnRoot(i);

View File

@ -1,14 +1,17 @@
#ifndef PARQUET_TABLE_H #ifndef PARQUET_TABLE_H
#define PARQUET_TABLE_H #define PARQUET_TABLE_H
#include <vector>
#include <string> #include <string>
class ParquetTable { class ParquetTable {
std::vector<std::string> columnNames;
public: public:
ParquetTable(std::string file); ParquetTable(std::string file);
std::string CreateStatement(); std::string CreateStatement();
std::string file; std::string file;
std::string columnName(int idx);
}; };
#endif #endif