modernc.org/cc@v1.0.1/v2/testdata/_sqlite/src/callback.c (about)

     1  /*
     2  ** 2005 May 23 
     3  **
     4  ** The author disclaims copyright to this source code.  In place of
     5  ** a legal notice, here is a blessing:
     6  **
     7  **    May you do good and not evil.
     8  **    May you find forgiveness for yourself and forgive others.
     9  **    May you share freely, never taking more than you give.
    10  **
    11  *************************************************************************
    12  **
    13  ** This file contains functions used to access the internal hash tables
    14  ** of user defined functions and collation sequences.
    15  */
    16  
    17  #include "sqliteInt.h"
    18  
    19  /*
    20  ** Invoke the 'collation needed' callback to request a collation sequence
    21  ** in the encoding enc of name zName, length nName.
    22  */
    23  static void callCollNeeded(sqlite3 *db, int enc, const char *zName){
    24    assert( !db->xCollNeeded || !db->xCollNeeded16 );
    25    if( db->xCollNeeded ){
    26      char *zExternal = sqlite3DbStrDup(db, zName);
    27      if( !zExternal ) return;
    28      db->xCollNeeded(db->pCollNeededArg, db, enc, zExternal);
    29      sqlite3DbFree(db, zExternal);
    30    }
    31  #ifndef SQLITE_OMIT_UTF16
    32    if( db->xCollNeeded16 ){
    33      char const *zExternal;
    34      sqlite3_value *pTmp = sqlite3ValueNew(db);
    35      sqlite3ValueSetStr(pTmp, -1, zName, SQLITE_UTF8, SQLITE_STATIC);
    36      zExternal = sqlite3ValueText(pTmp, SQLITE_UTF16NATIVE);
    37      if( zExternal ){
    38        db->xCollNeeded16(db->pCollNeededArg, db, (int)ENC(db), zExternal);
    39      }
    40      sqlite3ValueFree(pTmp);
    41    }
    42  #endif
    43  }
    44  
    45  /*
    46  ** This routine is called if the collation factory fails to deliver a
    47  ** collation function in the best encoding but there may be other versions
    48  ** of this collation function (for other text encodings) available. Use one
    49  ** of these instead if they exist. Avoid a UTF-8 <-> UTF-16 conversion if
    50  ** possible.
    51  */
    52  static int synthCollSeq(sqlite3 *db, CollSeq *pColl){
    53    CollSeq *pColl2;
    54    char *z = pColl->zName;
    55    int i;
    56    static const u8 aEnc[] = { SQLITE_UTF16BE, SQLITE_UTF16LE, SQLITE_UTF8 };
    57    for(i=0; i<3; i++){
    58      pColl2 = sqlite3FindCollSeq(db, aEnc[i], z, 0);
    59      if( pColl2->xCmp!=0 ){
    60        memcpy(pColl, pColl2, sizeof(CollSeq));
    61        pColl->xDel = 0;         /* Do not copy the destructor */
    62        return SQLITE_OK;
    63      }
    64    }
    65    return SQLITE_ERROR;
    66  }
    67  
    68  /*
    69  ** This function is responsible for invoking the collation factory callback
    70  ** or substituting a collation sequence of a different encoding when the
    71  ** requested collation sequence is not available in the desired encoding.
    72  ** 
    73  ** If it is not NULL, then pColl must point to the database native encoding 
    74  ** collation sequence with name zName, length nName.
    75  **
    76  ** The return value is either the collation sequence to be used in database
    77  ** db for collation type name zName, length nName, or NULL, if no collation
    78  ** sequence can be found.  If no collation is found, leave an error message.
    79  **
    80  ** See also: sqlite3LocateCollSeq(), sqlite3FindCollSeq()
    81  */
    82  CollSeq *sqlite3GetCollSeq(
    83    Parse *pParse,        /* Parsing context */
    84    u8 enc,               /* The desired encoding for the collating sequence */
    85    CollSeq *pColl,       /* Collating sequence with native encoding, or NULL */
    86    const char *zName     /* Collating sequence name */
    87  ){
    88    CollSeq *p;
    89    sqlite3 *db = pParse->db;
    90  
    91    p = pColl;
    92    if( !p ){
    93      p = sqlite3FindCollSeq(db, enc, zName, 0);
    94    }
    95    if( !p || !p->xCmp ){
    96      /* No collation sequence of this type for this encoding is registered.
    97      ** Call the collation factory to see if it can supply us with one.
    98      */
    99      callCollNeeded(db, enc, zName);
   100      p = sqlite3FindCollSeq(db, enc, zName, 0);
   101    }
   102    if( p && !p->xCmp && synthCollSeq(db, p) ){
   103      p = 0;
   104    }
   105    assert( !p || p->xCmp );
   106    if( p==0 ){
   107      sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName);
   108    }
   109    return p;
   110  }
   111  
   112  /*
   113  ** This routine is called on a collation sequence before it is used to
   114  ** check that it is defined. An undefined collation sequence exists when
   115  ** a database is loaded that contains references to collation sequences
   116  ** that have not been defined by sqlite3_create_collation() etc.
   117  **
   118  ** If required, this routine calls the 'collation needed' callback to
   119  ** request a definition of the collating sequence. If this doesn't work, 
   120  ** an equivalent collating sequence that uses a text encoding different
   121  ** from the main database is substituted, if one is available.
   122  */
   123  int sqlite3CheckCollSeq(Parse *pParse, CollSeq *pColl){
   124    if( pColl && pColl->xCmp==0 ){
   125      const char *zName = pColl->zName;
   126      sqlite3 *db = pParse->db;
   127      CollSeq *p = sqlite3GetCollSeq(pParse, ENC(db), pColl, zName);
   128      if( !p ){
   129        return SQLITE_ERROR;
   130      }
   131      assert( p==pColl );
   132    }
   133    return SQLITE_OK;
   134  }
   135  
   136  
   137  
   138  /*
   139  ** Locate and return an entry from the db.aCollSeq hash table. If the entry
   140  ** specified by zName and nName is not found and parameter 'create' is
   141  ** true, then create a new entry. Otherwise return NULL.
   142  **
   143  ** Each pointer stored in the sqlite3.aCollSeq hash table contains an
   144  ** array of three CollSeq structures. The first is the collation sequence
   145  ** preferred for UTF-8, the second UTF-16le, and the third UTF-16be.
   146  **
   147  ** Stored immediately after the three collation sequences is a copy of
   148  ** the collation sequence name. A pointer to this string is stored in
   149  ** each collation sequence structure.
   150  */
   151  static CollSeq *findCollSeqEntry(
   152    sqlite3 *db,          /* Database connection */
   153    const char *zName,    /* Name of the collating sequence */
   154    int create            /* Create a new entry if true */
   155  ){
   156    CollSeq *pColl;
   157    pColl = sqlite3HashFind(&db->aCollSeq, zName);
   158  
   159    if( 0==pColl && create ){
   160      int nName = sqlite3Strlen30(zName) + 1;
   161      pColl = sqlite3DbMallocZero(db, 3*sizeof(*pColl) + nName);
   162      if( pColl ){
   163        CollSeq *pDel = 0;
   164        pColl[0].zName = (char*)&pColl[3];
   165        pColl[0].enc = SQLITE_UTF8;
   166        pColl[1].zName = (char*)&pColl[3];
   167        pColl[1].enc = SQLITE_UTF16LE;
   168        pColl[2].zName = (char*)&pColl[3];
   169        pColl[2].enc = SQLITE_UTF16BE;
   170        memcpy(pColl[0].zName, zName, nName);
   171        pDel = sqlite3HashInsert(&db->aCollSeq, pColl[0].zName, pColl);
   172  
   173        /* If a malloc() failure occurred in sqlite3HashInsert(), it will 
   174        ** return the pColl pointer to be deleted (because it wasn't added
   175        ** to the hash table).
   176        */
   177        assert( pDel==0 || pDel==pColl );
   178        if( pDel!=0 ){
   179          sqlite3OomFault(db);
   180          sqlite3DbFree(db, pDel);
   181          pColl = 0;
   182        }
   183      }
   184    }
   185    return pColl;
   186  }
   187  
   188  /*
   189  ** Parameter zName points to a UTF-8 encoded string nName bytes long.
   190  ** Return the CollSeq* pointer for the collation sequence named zName
   191  ** for the encoding 'enc' from the database 'db'.
   192  **
   193  ** If the entry specified is not found and 'create' is true, then create a
   194  ** new entry.  Otherwise return NULL.
   195  **
   196  ** A separate function sqlite3LocateCollSeq() is a wrapper around
   197  ** this routine.  sqlite3LocateCollSeq() invokes the collation factory
   198  ** if necessary and generates an error message if the collating sequence
   199  ** cannot be found.
   200  **
   201  ** See also: sqlite3LocateCollSeq(), sqlite3GetCollSeq()
   202  */
   203  CollSeq *sqlite3FindCollSeq(
   204    sqlite3 *db,
   205    u8 enc,
   206    const char *zName,
   207    int create
   208  ){
   209    CollSeq *pColl;
   210    if( zName ){
   211      pColl = findCollSeqEntry(db, zName, create);
   212    }else{
   213      pColl = db->pDfltColl;
   214    }
   215    assert( SQLITE_UTF8==1 && SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 );
   216    assert( enc>=SQLITE_UTF8 && enc<=SQLITE_UTF16BE );
   217    if( pColl ) pColl += enc-1;
   218    return pColl;
   219  }
   220  
   221  /* During the search for the best function definition, this procedure
   222  ** is called to test how well the function passed as the first argument
   223  ** matches the request for a function with nArg arguments in a system
   224  ** that uses encoding enc. The value returned indicates how well the
   225  ** request is matched. A higher value indicates a better match.
   226  **
   227  ** If nArg is -1 that means to only return a match (non-zero) if p->nArg
   228  ** is also -1.  In other words, we are searching for a function that
   229  ** takes a variable number of arguments.
   230  **
   231  ** If nArg is -2 that means that we are searching for any function 
   232  ** regardless of the number of arguments it uses, so return a positive
   233  ** match score for any
   234  **
   235  ** The returned value is always between 0 and 6, as follows:
   236  **
   237  ** 0: Not a match.
   238  ** 1: UTF8/16 conversion required and function takes any number of arguments.
   239  ** 2: UTF16 byte order change required and function takes any number of args.
   240  ** 3: encoding matches and function takes any number of arguments
   241  ** 4: UTF8/16 conversion required - argument count matches exactly
   242  ** 5: UTF16 byte order conversion required - argument count matches exactly
   243  ** 6: Perfect match:  encoding and argument count match exactly.
   244  **
   245  ** If nArg==(-2) then any function with a non-null xSFunc is
   246  ** a perfect match and any function with xSFunc NULL is
   247  ** a non-match.
   248  */
   249  #define FUNC_PERFECT_MATCH 6  /* The score for a perfect match */
   250  static int matchQuality(
   251    FuncDef *p,     /* The function we are evaluating for match quality */
   252    int nArg,       /* Desired number of arguments.  (-1)==any */
   253    u8 enc          /* Desired text encoding */
   254  ){
   255    int match;
   256  
   257    /* nArg of -2 is a special case */
   258    if( nArg==(-2) ) return (p->xSFunc==0) ? 0 : FUNC_PERFECT_MATCH;
   259  
   260    /* Wrong number of arguments means "no match" */
   261    if( p->nArg!=nArg && p->nArg>=0 ) return 0;
   262  
   263    /* Give a better score to a function with a specific number of arguments
   264    ** than to function that accepts any number of arguments. */
   265    if( p->nArg==nArg ){
   266      match = 4;
   267    }else{
   268      match = 1;
   269    }
   270  
   271    /* Bonus points if the text encoding matches */
   272    if( enc==(p->funcFlags & SQLITE_FUNC_ENCMASK) ){
   273      match += 2;  /* Exact encoding match */
   274    }else if( (enc & p->funcFlags & 2)!=0 ){
   275      match += 1;  /* Both are UTF16, but with different byte orders */
   276    }
   277  
   278    return match;
   279  }
   280  
   281  /*
   282  ** Search a FuncDefHash for a function with the given name.  Return
   283  ** a pointer to the matching FuncDef if found, or 0 if there is no match.
   284  */
   285  static FuncDef *functionSearch(
   286    int h,               /* Hash of the name */
   287    const char *zFunc    /* Name of function */
   288  ){
   289    FuncDef *p;
   290    for(p=sqlite3BuiltinFunctions.a[h]; p; p=p->u.pHash){
   291      if( sqlite3StrICmp(p->zName, zFunc)==0 ){
   292        return p;
   293      }
   294    }
   295    return 0;
   296  }
   297  
   298  /*
   299  ** Insert a new FuncDef into a FuncDefHash hash table.
   300  */
   301  void sqlite3InsertBuiltinFuncs(
   302    FuncDef *aDef,      /* List of global functions to be inserted */
   303    int nDef            /* Length of the apDef[] list */
   304  ){
   305    int i;
   306    for(i=0; i<nDef; i++){
   307      FuncDef *pOther;
   308      const char *zName = aDef[i].zName;
   309      int nName = sqlite3Strlen30(zName);
   310      int h = (zName[0] + nName) % SQLITE_FUNC_HASH_SZ;
   311      assert( zName[0]>='a' && zName[0]<='z' );
   312      pOther = functionSearch(h, zName);
   313      if( pOther ){
   314        assert( pOther!=&aDef[i] && pOther->pNext!=&aDef[i] );
   315        aDef[i].pNext = pOther->pNext;
   316        pOther->pNext = &aDef[i];
   317      }else{
   318        aDef[i].pNext = 0;
   319        aDef[i].u.pHash = sqlite3BuiltinFunctions.a[h];
   320        sqlite3BuiltinFunctions.a[h] = &aDef[i];
   321      }
   322    }
   323  }
   324    
   325    
   326  
   327  /*
   328  ** Locate a user function given a name, a number of arguments and a flag
   329  ** indicating whether the function prefers UTF-16 over UTF-8.  Return a
   330  ** pointer to the FuncDef structure that defines that function, or return
   331  ** NULL if the function does not exist.
   332  **
   333  ** If the createFlag argument is true, then a new (blank) FuncDef
   334  ** structure is created and liked into the "db" structure if a
   335  ** no matching function previously existed.
   336  **
   337  ** If nArg is -2, then the first valid function found is returned.  A
   338  ** function is valid if xSFunc is non-zero.  The nArg==(-2)
   339  ** case is used to see if zName is a valid function name for some number
   340  ** of arguments.  If nArg is -2, then createFlag must be 0.
   341  **
   342  ** If createFlag is false, then a function with the required name and
   343  ** number of arguments may be returned even if the eTextRep flag does not
   344  ** match that requested.
   345  */
   346  FuncDef *sqlite3FindFunction(
   347    sqlite3 *db,       /* An open database */
   348    const char *zName, /* Name of the function.  zero-terminated */
   349    int nArg,          /* Number of arguments.  -1 means any number */
   350    u8 enc,            /* Preferred text encoding */
   351    u8 createFlag      /* Create new entry if true and does not otherwise exist */
   352  ){
   353    FuncDef *p;         /* Iterator variable */
   354    FuncDef *pBest = 0; /* Best match found so far */
   355    int bestScore = 0;  /* Score of best match */
   356    int h;              /* Hash value */
   357    int nName;          /* Length of the name */
   358  
   359    assert( nArg>=(-2) );
   360    assert( nArg>=(-1) || createFlag==0 );
   361    nName = sqlite3Strlen30(zName);
   362  
   363    /* First search for a match amongst the application-defined functions.
   364    */
   365    p = (FuncDef*)sqlite3HashFind(&db->aFunc, zName);
   366    while( p ){
   367      int score = matchQuality(p, nArg, enc);
   368      if( score>bestScore ){
   369        pBest = p;
   370        bestScore = score;
   371      }
   372      p = p->pNext;
   373    }
   374  
   375    /* If no match is found, search the built-in functions.
   376    **
   377    ** If the DBFLAG_PreferBuiltin flag is set, then search the built-in
   378    ** functions even if a prior app-defined function was found.  And give
   379    ** priority to built-in functions.
   380    **
   381    ** Except, if createFlag is true, that means that we are trying to
   382    ** install a new function.  Whatever FuncDef structure is returned it will
   383    ** have fields overwritten with new information appropriate for the
   384    ** new function.  But the FuncDefs for built-in functions are read-only.
   385    ** So we must not search for built-ins when creating a new function.
   386    */ 
   387    if( !createFlag && (pBest==0 || (db->mDbFlags & DBFLAG_PreferBuiltin)!=0) ){
   388      bestScore = 0;
   389      h = (sqlite3UpperToLower[(u8)zName[0]] + nName) % SQLITE_FUNC_HASH_SZ;
   390      p = functionSearch(h, zName);
   391      while( p ){
   392        int score = matchQuality(p, nArg, enc);
   393        if( score>bestScore ){
   394          pBest = p;
   395          bestScore = score;
   396        }
   397        p = p->pNext;
   398      }
   399    }
   400  
   401    /* If the createFlag parameter is true and the search did not reveal an
   402    ** exact match for the name, number of arguments and encoding, then add a
   403    ** new entry to the hash table and return it.
   404    */
   405    if( createFlag && bestScore<FUNC_PERFECT_MATCH && 
   406        (pBest = sqlite3DbMallocZero(db, sizeof(*pBest)+nName+1))!=0 ){
   407      FuncDef *pOther;
   408      pBest->zName = (const char*)&pBest[1];
   409      pBest->nArg = (u16)nArg;
   410      pBest->funcFlags = enc;
   411      memcpy((char*)&pBest[1], zName, nName+1);
   412      pOther = (FuncDef*)sqlite3HashInsert(&db->aFunc, pBest->zName, pBest);
   413      if( pOther==pBest ){
   414        sqlite3DbFree(db, pBest);
   415        sqlite3OomFault(db);
   416        return 0;
   417      }else{
   418        pBest->pNext = pOther;
   419      }
   420    }
   421  
   422    if( pBest && (pBest->xSFunc || createFlag) ){
   423      return pBest;
   424    }
   425    return 0;
   426  }
   427  
   428  /*
   429  ** Free all resources held by the schema structure. The void* argument points
   430  ** at a Schema struct. This function does not call sqlite3DbFree(db, ) on the 
   431  ** pointer itself, it just cleans up subsidiary resources (i.e. the contents
   432  ** of the schema hash tables).
   433  **
   434  ** The Schema.cache_size variable is not cleared.
   435  */
   436  void sqlite3SchemaClear(void *p){
   437    Hash temp1;
   438    Hash temp2;
   439    HashElem *pElem;
   440    Schema *pSchema = (Schema *)p;
   441  
   442    temp1 = pSchema->tblHash;
   443    temp2 = pSchema->trigHash;
   444    sqlite3HashInit(&pSchema->trigHash);
   445    sqlite3HashClear(&pSchema->idxHash);
   446    for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){
   447      sqlite3DeleteTrigger(0, (Trigger*)sqliteHashData(pElem));
   448    }
   449    sqlite3HashClear(&temp2);
   450    sqlite3HashInit(&pSchema->tblHash);
   451    for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){
   452      Table *pTab = sqliteHashData(pElem);
   453      sqlite3DeleteTable(0, pTab);
   454    }
   455    sqlite3HashClear(&temp1);
   456    sqlite3HashClear(&pSchema->fkeyHash);
   457    pSchema->pSeqTab = 0;
   458    if( pSchema->schemaFlags & DB_SchemaLoaded ){
   459      pSchema->iGeneration++;
   460    }
   461    pSchema->schemaFlags &= ~(DB_SchemaLoaded|DB_ResetWanted);
   462  }
   463  
   464  /*
   465  ** Find and return the schema associated with a BTree.  Create
   466  ** a new one if necessary.
   467  */
   468  Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){
   469    Schema * p;
   470    if( pBt ){
   471      p = (Schema *)sqlite3BtreeSchema(pBt, sizeof(Schema), sqlite3SchemaClear);
   472    }else{
   473      p = (Schema *)sqlite3DbMallocZero(0, sizeof(Schema));
   474    }
   475    if( !p ){
   476      sqlite3OomFault(db);
   477    }else if ( 0==p->file_format ){
   478      sqlite3HashInit(&p->tblHash);
   479      sqlite3HashInit(&p->idxHash);
   480      sqlite3HashInit(&p->trigHash);
   481      sqlite3HashInit(&p->fkeyHash);
   482      p->enc = SQLITE_UTF8;
   483    }
   484    return p;
   485  }