SQLite

Check-in [3f8f461504]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Minor bug fixes and enhancements to the pragma eponymous virtual tables.
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | pragma-as-vtab
Files: files | file ages | folders
SHA1: 3f8f461504139a4efea0e033e3a274cc4b2d3072
User & Date: drh 2016-12-16 02:14:15.843
Context
2016-12-16
02:31
Simplifications to facilitate full test coverage. (check-in: 01afc51597 user: drh tags: pragma-as-vtab)
02:14
Minor bug fixes and enhancements to the pragma eponymous virtual tables. (check-in: 3f8f461504 user: drh tags: pragma-as-vtab)
01:09
Merge enhancements from trunk, and especially the ability to use temp.sqlite_master as an alias for sqlite_temp_master. (check-in: 994a4401f5 user: drh tags: pragma-as-vtab)
Changes
Side-by-Side Diff Ignore Whitespace Patch
Changes to src/pragma.c.
1998
1999
2000
2001
2002
2003
2004





2005
2006
2007
2008
2009
2010
2011
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016







+
+
+
+
+








  sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0);
  sqlite3StrAccumAppendAll(&acc, "CREATE TABLE x");
  for(i=0, j=pPragma->iPragCName; i<pPragma->nPragCName; i++, j++){
    sqlite3XPrintf(&acc, "%c\"%s\"", cSep, pragCName[j]);
    cSep = ',';
  }
  if( i==0 ){
    sqlite3XPrintf(&acc, "(\"%s\"", pPragma->zName);
    cSep = ',';
    i++;
  }
  j = 0;
  if( pPragma->mPragFlg & PragFlg_Result1 ){
    sqlite3StrAccumAppendAll(&acc, ",arg HIDDEN");
    j++;
  }
  if( pPragma->mPragFlg & (PragFlg_SchemaOpt|PragFlg_SchemaReq) ){
    sqlite3StrAccumAppendAll(&acc, ",schema HIDDEN");
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2068
2069
2070
2071
2072
2073
2074

2075
2076
2077
2078
2079
2080
2081







-







  seen[1] = 0;
  for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
    if( pConstraint->usable==0 ) continue;
    if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
    if( pConstraint->iColumn < pTab->iHidden ) continue;
    j = pConstraint->iColumn - pTab->iHidden;
    assert( j < 2 );
    if( seen[j] ) continue;
    seen[j] = i+1;
  }
  if( seen[0]==0 ){
    pIdxInfo->estimatedCost = (double)2147483647;
    pIdxInfo->estimatedRows = 2147483647;
    return SQLITE_OK;
  }
2109
2110
2111
2112
2113
2114
2115

2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130





2131
2132
2133
2134
2135
2136
2137
2138
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130





2131
2132
2133
2134
2135

2136
2137
2138
2139
2140
2141
2142







+










-
-
-
-
-
+
+
+
+
+
-







  }
}

/* Close a pragma virtual table cursor */
static int pragmaVtabClose(sqlite3_vtab_cursor *cur){
  PragmaVtabCursor *pCsr = (PragmaVtabCursor*)cur;
  pragmaVtabCursorClear(pCsr);
  sqlite3_free(pCsr);
  return SQLITE_OK;
}

/* Advance the pragma virtual table cursor to the next row */
static int pragmaVtabNext(sqlite3_vtab_cursor *pVtabCursor){
  PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor;
  int rc = SQLITE_OK;

  /* Increment the xRowid value */
  pCsr->iRowid++;
  if( pCsr->pPragma ){
    if( SQLITE_ROW!=sqlite3_step(pCsr->pPragma) ){
      rc = sqlite3_finalize(pCsr->pPragma);
      pCsr->pPragma = 0;
      pragmaVtabCursorClear(pCsr);
  assert( pCsr->pPragma );
  if( SQLITE_ROW!=sqlite3_step(pCsr->pPragma) ){
    rc = sqlite3_finalize(pCsr->pPragma);
    pCsr->pPragma = 0;
    pragmaVtabCursorClear(pCsr);
    }
  }
  return rc;
}

/* 
** Pragma virtual table module xFilter method.
*/
Changes to src/vtab.c.
53
54
55
56
57
58
59

60
61
62
63
64
65
66
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67







+







    pMod->xDestroy = xDestroy;
    pMod->pEpoTab = 0;
    pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod);
    assert( pDel==0 || pDel==pMod );
    if( pDel ){
      sqlite3OomFault(db);
      sqlite3DbFree(db, pDel);
      pMod = 0;
    }
  }
  return pMod;
}

/*
** The actual function that does the work of creating a new module.