1fd9a0a45Sdanielk1977 /* 2fd9a0a45Sdanielk1977 ** 2005 May 23 3fd9a0a45Sdanielk1977 ** 4fd9a0a45Sdanielk1977 ** The author disclaims copyright to this source code. In place of 5fd9a0a45Sdanielk1977 ** a legal notice, here is a blessing: 6fd9a0a45Sdanielk1977 ** 7fd9a0a45Sdanielk1977 ** May you do good and not evil. 8fd9a0a45Sdanielk1977 ** May you find forgiveness for yourself and forgive others. 9fd9a0a45Sdanielk1977 ** May you share freely, never taking more than you give. 10fd9a0a45Sdanielk1977 ** 11fd9a0a45Sdanielk1977 ************************************************************************* 12fd9a0a45Sdanielk1977 ** 13fd9a0a45Sdanielk1977 ** This file contains functions used to access the internal hash tables 14fd9a0a45Sdanielk1977 ** of user defined functions and collation sequences. 15fd9a0a45Sdanielk1977 */ 16fd9a0a45Sdanielk1977 17fd9a0a45Sdanielk1977 #include "sqliteInt.h" 18fd9a0a45Sdanielk1977 19fd9a0a45Sdanielk1977 /* 204dade037Sdanielk1977 ** Invoke the 'collation needed' callback to request a collation sequence 219aeda79cSdrh ** in the encoding enc of name zName, length nName. 224dade037Sdanielk1977 */ 239aeda79cSdrh static void callCollNeeded(sqlite3 *db, int enc, const char *zName){ 244dade037Sdanielk1977 assert( !db->xCollNeeded || !db->xCollNeeded16 ); 254dade037Sdanielk1977 if( db->xCollNeeded ){ 26c4a64facSdrh char *zExternal = sqlite3DbStrDup(db, zName); 274dade037Sdanielk1977 if( !zExternal ) return; 289aeda79cSdrh db->xCollNeeded(db->pCollNeededArg, db, enc, zExternal); 29633e6d57Sdrh sqlite3DbFree(db, zExternal); 304dade037Sdanielk1977 } 314dade037Sdanielk1977 #ifndef SQLITE_OMIT_UTF16 324dade037Sdanielk1977 if( db->xCollNeeded16 ){ 334dade037Sdanielk1977 char const *zExternal; 341e536953Sdanielk1977 sqlite3_value *pTmp = sqlite3ValueNew(db); 35c4a64facSdrh sqlite3ValueSetStr(pTmp, -1, zName, SQLITE_UTF8, SQLITE_STATIC); 36b21c8cd4Sdrh zExternal = sqlite3ValueText(pTmp, SQLITE_UTF16NATIVE); 3726abcb1eSdrh if( zExternal ){ 3814db2665Sdanielk1977 db->xCollNeeded16(db->pCollNeededArg, db, (int)ENC(db), zExternal); 394dade037Sdanielk1977 } 4026abcb1eSdrh sqlite3ValueFree(pTmp); 4126abcb1eSdrh } 424dade037Sdanielk1977 #endif 434dade037Sdanielk1977 } 444dade037Sdanielk1977 454dade037Sdanielk1977 /* 464dade037Sdanielk1977 ** This routine is called if the collation factory fails to deliver a 474dade037Sdanielk1977 ** collation function in the best encoding but there may be other versions 484dade037Sdanielk1977 ** of this collation function (for other text encodings) available. Use one 494dade037Sdanielk1977 ** of these instead if they exist. Avoid a UTF-8 <-> UTF-16 conversion if 504dade037Sdanielk1977 ** possible. 514dade037Sdanielk1977 */ 524dade037Sdanielk1977 static int synthCollSeq(sqlite3 *db, CollSeq *pColl){ 534dade037Sdanielk1977 CollSeq *pColl2; 544dade037Sdanielk1977 char *z = pColl->zName; 554dade037Sdanielk1977 int i; 564dade037Sdanielk1977 static const u8 aEnc[] = { SQLITE_UTF16BE, SQLITE_UTF16LE, SQLITE_UTF8 }; 574dade037Sdanielk1977 for(i=0; i<3; i++){ 58c4a64facSdrh pColl2 = sqlite3FindCollSeq(db, aEnc[i], z, 0); 594dade037Sdanielk1977 if( pColl2->xCmp!=0 ){ 604dade037Sdanielk1977 memcpy(pColl, pColl2, sizeof(CollSeq)); 61a9808b31Sdanielk1977 pColl->xDel = 0; /* Do not copy the destructor */ 624dade037Sdanielk1977 return SQLITE_OK; 634dade037Sdanielk1977 } 644dade037Sdanielk1977 } 654dade037Sdanielk1977 return SQLITE_ERROR; 664dade037Sdanielk1977 } 674dade037Sdanielk1977 684dade037Sdanielk1977 /* 694dade037Sdanielk1977 ** This routine is called on a collation sequence before it is used to 704dade037Sdanielk1977 ** check that it is defined. An undefined collation sequence exists when 714dade037Sdanielk1977 ** a database is loaded that contains references to collation sequences 724dade037Sdanielk1977 ** that have not been defined by sqlite3_create_collation() etc. 734dade037Sdanielk1977 ** 744dade037Sdanielk1977 ** If required, this routine calls the 'collation needed' callback to 754dade037Sdanielk1977 ** request a definition of the collating sequence. If this doesn't work, 764dade037Sdanielk1977 ** an equivalent collating sequence that uses a text encoding different 774dade037Sdanielk1977 ** from the main database is substituted, if one is available. 784dade037Sdanielk1977 */ 794dade037Sdanielk1977 int sqlite3CheckCollSeq(Parse *pParse, CollSeq *pColl){ 80666e8662Sdrh if( pColl && pColl->xCmp==0 ){ 814dade037Sdanielk1977 const char *zName = pColl->zName; 829aeda79cSdrh sqlite3 *db = pParse->db; 8379e72a50Sdrh CollSeq *p = sqlite3GetCollSeq(pParse, ENC(db), pColl, zName); 844dade037Sdanielk1977 if( !p ){ 854dade037Sdanielk1977 return SQLITE_ERROR; 864dade037Sdanielk1977 } 87b3bf556eSdanielk1977 assert( p==pColl ); 884dade037Sdanielk1977 } 894dade037Sdanielk1977 return SQLITE_OK; 904dade037Sdanielk1977 } 914dade037Sdanielk1977 924dade037Sdanielk1977 934dade037Sdanielk1977 944dade037Sdanielk1977 /* 95fd9a0a45Sdanielk1977 ** Locate and return an entry from the db.aCollSeq hash table. If the entry 96fd9a0a45Sdanielk1977 ** specified by zName and nName is not found and parameter 'create' is 97fd9a0a45Sdanielk1977 ** true, then create a new entry. Otherwise return NULL. 98fd9a0a45Sdanielk1977 ** 99fd9a0a45Sdanielk1977 ** Each pointer stored in the sqlite3.aCollSeq hash table contains an 100fd9a0a45Sdanielk1977 ** array of three CollSeq structures. The first is the collation sequence 10160ec914cSpeter.d.reid ** preferred for UTF-8, the second UTF-16le, and the third UTF-16be. 102fd9a0a45Sdanielk1977 ** 103fd9a0a45Sdanielk1977 ** Stored immediately after the three collation sequences is a copy of 104fd9a0a45Sdanielk1977 ** the collation sequence name. A pointer to this string is stored in 105fd9a0a45Sdanielk1977 ** each collation sequence structure. 106fd9a0a45Sdanielk1977 */ 107fd9a0a45Sdanielk1977 static CollSeq *findCollSeqEntry( 108c4a64facSdrh sqlite3 *db, /* Database connection */ 109c4a64facSdrh const char *zName, /* Name of the collating sequence */ 110c4a64facSdrh int create /* Create a new entry if true */ 111fd9a0a45Sdanielk1977 ){ 112fd9a0a45Sdanielk1977 CollSeq *pColl; 113acbcb7e0Sdrh pColl = sqlite3HashFind(&db->aCollSeq, zName); 114fd9a0a45Sdanielk1977 115fd9a0a45Sdanielk1977 if( 0==pColl && create ){ 1163b02e0f6Sdrh int nName = sqlite3Strlen30(zName) + 1; 1173b02e0f6Sdrh pColl = sqlite3DbMallocZero(db, 3*sizeof(*pColl) + nName); 118fd9a0a45Sdanielk1977 if( pColl ){ 119fd9a0a45Sdanielk1977 CollSeq *pDel = 0; 120fd9a0a45Sdanielk1977 pColl[0].zName = (char*)&pColl[3]; 121fd9a0a45Sdanielk1977 pColl[0].enc = SQLITE_UTF8; 122fd9a0a45Sdanielk1977 pColl[1].zName = (char*)&pColl[3]; 123fd9a0a45Sdanielk1977 pColl[1].enc = SQLITE_UTF16LE; 124fd9a0a45Sdanielk1977 pColl[2].zName = (char*)&pColl[3]; 125fd9a0a45Sdanielk1977 pColl[2].enc = SQLITE_UTF16BE; 126fd9a0a45Sdanielk1977 memcpy(pColl[0].zName, zName, nName); 127acbcb7e0Sdrh pDel = sqlite3HashInsert(&db->aCollSeq, pColl[0].zName, pColl); 128fd9a0a45Sdanielk1977 129be217793Sshane /* If a malloc() failure occurred in sqlite3HashInsert(), it will 130fd9a0a45Sdanielk1977 ** return the pColl pointer to be deleted (because it wasn't added 131fd9a0a45Sdanielk1977 ** to the hash table). 132fd9a0a45Sdanielk1977 */ 133f3a65f7eSdrh assert( pDel==0 || pDel==pColl ); 134f3a65f7eSdrh if( pDel!=0 ){ 1354a642b60Sdrh sqlite3OomFault(db); 136633e6d57Sdrh sqlite3DbFree(db, pDel); 13791171cdeSdrh pColl = 0; 13891171cdeSdrh } 139fd9a0a45Sdanielk1977 } 140fd9a0a45Sdanielk1977 } 141fd9a0a45Sdanielk1977 return pColl; 142fd9a0a45Sdanielk1977 } 143fd9a0a45Sdanielk1977 144fd9a0a45Sdanielk1977 /* 145fd9a0a45Sdanielk1977 ** Parameter zName points to a UTF-8 encoded string nName bytes long. 146fd9a0a45Sdanielk1977 ** Return the CollSeq* pointer for the collation sequence named zName 147fd9a0a45Sdanielk1977 ** for the encoding 'enc' from the database 'db'. 148fd9a0a45Sdanielk1977 ** 149fd9a0a45Sdanielk1977 ** If the entry specified is not found and 'create' is true, then create a 150fd9a0a45Sdanielk1977 ** new entry. Otherwise return NULL. 151a34001c9Sdrh ** 152a34001c9Sdrh ** A separate function sqlite3LocateCollSeq() is a wrapper around 153a34001c9Sdrh ** this routine. sqlite3LocateCollSeq() invokes the collation factory 154a34001c9Sdrh ** if necessary and generates an error message if the collating sequence 155a34001c9Sdrh ** cannot be found. 156c4a64facSdrh ** 157c4a64facSdrh ** See also: sqlite3LocateCollSeq(), sqlite3GetCollSeq() 158fd9a0a45Sdanielk1977 */ 159fd9a0a45Sdanielk1977 CollSeq *sqlite3FindCollSeq( 160a5d09115Sdrh sqlite3 *db, /* Database connection to search */ 161a5d09115Sdrh u8 enc, /* Desired text encoding */ 162a5d09115Sdrh const char *zName, /* Name of the collating sequence. Might be NULL */ 163a5d09115Sdrh int create /* True to create CollSeq if doesn't already exist */ 164fd9a0a45Sdanielk1977 ){ 165b3bf556eSdanielk1977 CollSeq *pColl; 166b3bf556eSdanielk1977 if( zName ){ 167c4a64facSdrh pColl = findCollSeqEntry(db, zName, create); 168b3bf556eSdanielk1977 }else{ 169b3bf556eSdanielk1977 pColl = db->pDfltColl; 170b3bf556eSdanielk1977 } 171fd9a0a45Sdanielk1977 assert( SQLITE_UTF8==1 && SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); 172fd9a0a45Sdanielk1977 assert( enc>=SQLITE_UTF8 && enc<=SQLITE_UTF16BE ); 173fd9a0a45Sdanielk1977 if( pColl ) pColl += enc-1; 174fd9a0a45Sdanielk1977 return pColl; 175fd9a0a45Sdanielk1977 } 176fd9a0a45Sdanielk1977 177a5d09115Sdrh /* 178a5d09115Sdrh ** This function is responsible for invoking the collation factory callback 179a5d09115Sdrh ** or substituting a collation sequence of a different encoding when the 180a5d09115Sdrh ** requested collation sequence is not available in the desired encoding. 181a5d09115Sdrh ** 182a5d09115Sdrh ** If it is not NULL, then pColl must point to the database native encoding 183a5d09115Sdrh ** collation sequence with name zName, length nName. 184a5d09115Sdrh ** 185a5d09115Sdrh ** The return value is either the collation sequence to be used in database 186a5d09115Sdrh ** db for collation type name zName, length nName, or NULL, if no collation 187a5d09115Sdrh ** sequence can be found. If no collation is found, leave an error message. 188a5d09115Sdrh ** 189a5d09115Sdrh ** See also: sqlite3LocateCollSeq(), sqlite3FindCollSeq() 190a5d09115Sdrh */ 191a5d09115Sdrh CollSeq *sqlite3GetCollSeq( 192a5d09115Sdrh Parse *pParse, /* Parsing context */ 193a5d09115Sdrh u8 enc, /* The desired encoding for the collating sequence */ 194a5d09115Sdrh CollSeq *pColl, /* Collating sequence with native encoding, or NULL */ 195a5d09115Sdrh const char *zName /* Collating sequence name */ 196a5d09115Sdrh ){ 197a5d09115Sdrh CollSeq *p; 198a5d09115Sdrh sqlite3 *db = pParse->db; 199a5d09115Sdrh 200a5d09115Sdrh p = pColl; 201a5d09115Sdrh if( !p ){ 202a5d09115Sdrh p = sqlite3FindCollSeq(db, enc, zName, 0); 203a5d09115Sdrh } 204a5d09115Sdrh if( !p || !p->xCmp ){ 205a5d09115Sdrh /* No collation sequence of this type for this encoding is registered. 206a5d09115Sdrh ** Call the collation factory to see if it can supply us with one. 207a5d09115Sdrh */ 208a5d09115Sdrh callCollNeeded(db, enc, zName); 209a5d09115Sdrh p = sqlite3FindCollSeq(db, enc, zName, 0); 210a5d09115Sdrh } 211a5d09115Sdrh if( p && !p->xCmp && synthCollSeq(db, p) ){ 212a5d09115Sdrh p = 0; 213a5d09115Sdrh } 214a5d09115Sdrh assert( !p || p->xCmp ); 215a5d09115Sdrh if( p==0 ){ 216a5d09115Sdrh sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName); 217a5d09115Sdrh pParse->rc = SQLITE_ERROR_MISSING_COLLSEQ; 218a5d09115Sdrh } 219a5d09115Sdrh return p; 220a5d09115Sdrh } 221a5d09115Sdrh 222a5d09115Sdrh /* 223a5d09115Sdrh ** This function returns the collation sequence for database native text 224a5d09115Sdrh ** encoding identified by the string zName. 225a5d09115Sdrh ** 226a5d09115Sdrh ** If the requested collation sequence is not available, or not available 227a5d09115Sdrh ** in the database native encoding, the collation factory is invoked to 228a5d09115Sdrh ** request it. If the collation factory does not supply such a sequence, 229a5d09115Sdrh ** and the sequence is available in another text encoding, then that is 230a5d09115Sdrh ** returned instead. 231a5d09115Sdrh ** 232a5d09115Sdrh ** If no versions of the requested collations sequence are available, or 233a5d09115Sdrh ** another error occurs, NULL is returned and an error message written into 234a5d09115Sdrh ** pParse. 235a5d09115Sdrh ** 236a5d09115Sdrh ** This routine is a wrapper around sqlite3FindCollSeq(). This routine 237a5d09115Sdrh ** invokes the collation factory if the named collation cannot be found 238a5d09115Sdrh ** and generates an error message. 239a5d09115Sdrh ** 240a5d09115Sdrh ** See also: sqlite3FindCollSeq(), sqlite3GetCollSeq() 241a5d09115Sdrh */ 242a5d09115Sdrh CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){ 243a5d09115Sdrh sqlite3 *db = pParse->db; 244a5d09115Sdrh u8 enc = ENC(db); 245a5d09115Sdrh u8 initbusy = db->init.busy; 246a5d09115Sdrh CollSeq *pColl; 247a5d09115Sdrh 248a5d09115Sdrh pColl = sqlite3FindCollSeq(db, enc, zName, initbusy); 249a5d09115Sdrh if( !initbusy && (!pColl || !pColl->xCmp) ){ 250a5d09115Sdrh pColl = sqlite3GetCollSeq(pParse, enc, pColl, zName); 251a5d09115Sdrh } 252a5d09115Sdrh 253a5d09115Sdrh return pColl; 254a5d09115Sdrh } 255a5d09115Sdrh 2568c0a791aSdanielk1977 /* During the search for the best function definition, this procedure 2578c0a791aSdanielk1977 ** is called to test how well the function passed as the first argument 2588c0a791aSdanielk1977 ** matches the request for a function with nArg arguments in a system 2598c0a791aSdanielk1977 ** that uses encoding enc. The value returned indicates how well the 2608c0a791aSdanielk1977 ** request is matched. A higher value indicates a better match. 2618c0a791aSdanielk1977 ** 26289d5d6a2Sdrh ** If nArg is -1 that means to only return a match (non-zero) if p->nArg 26389d5d6a2Sdrh ** is also -1. In other words, we are searching for a function that 26489d5d6a2Sdrh ** takes a variable number of arguments. 26589d5d6a2Sdrh ** 26689d5d6a2Sdrh ** If nArg is -2 that means that we are searching for any function 26789d5d6a2Sdrh ** regardless of the number of arguments it uses, so return a positive 26889d5d6a2Sdrh ** match score for any 26989d5d6a2Sdrh ** 270dfbc3a8aSdrh ** The returned value is always between 0 and 6, as follows: 2718c0a791aSdanielk1977 ** 27289d5d6a2Sdrh ** 0: Not a match. 27389d5d6a2Sdrh ** 1: UTF8/16 conversion required and function takes any number of arguments. 27489d5d6a2Sdrh ** 2: UTF16 byte order change required and function takes any number of args. 27589d5d6a2Sdrh ** 3: encoding matches and function takes any number of arguments 27689d5d6a2Sdrh ** 4: UTF8/16 conversion required - argument count matches exactly 27789d5d6a2Sdrh ** 5: UTF16 byte order conversion required - argument count matches exactly 27889d5d6a2Sdrh ** 6: Perfect match: encoding and argument count match exactly. 2798c0a791aSdanielk1977 ** 2802d80151fSdrh ** If nArg==(-2) then any function with a non-null xSFunc is 2812d80151fSdrh ** a perfect match and any function with xSFunc NULL is 28289d5d6a2Sdrh ** a non-match. 2838c0a791aSdanielk1977 */ 28489d5d6a2Sdrh #define FUNC_PERFECT_MATCH 6 /* The score for a perfect match */ 28589d5d6a2Sdrh static int matchQuality( 28689d5d6a2Sdrh FuncDef *p, /* The function we are evaluating for match quality */ 28789d5d6a2Sdrh int nArg, /* Desired number of arguments. (-1)==any */ 28889d5d6a2Sdrh u8 enc /* Desired text encoding */ 289dfbc3a8aSdrh ){ 29089d5d6a2Sdrh int match; 291*2eeca204Sdrh assert( p->nArg>=-1 ); 29289d5d6a2Sdrh 29389d5d6a2Sdrh /* Wrong number of arguments means "no match" */ 294*2eeca204Sdrh if( p->nArg!=nArg ){ 295*2eeca204Sdrh if( nArg==(-2) ) return (p->xSFunc==0) ? 0 : FUNC_PERFECT_MATCH; 296*2eeca204Sdrh if( p->nArg>=0 ) return 0; 297*2eeca204Sdrh } 29889d5d6a2Sdrh 29989d5d6a2Sdrh /* Give a better score to a function with a specific number of arguments 30089d5d6a2Sdrh ** than to function that accepts any number of arguments. */ 30189d5d6a2Sdrh if( p->nArg==nArg ){ 3028c0a791aSdanielk1977 match = 4; 30389d5d6a2Sdrh }else{ 30489d5d6a2Sdrh match = 1; 3058c0a791aSdanielk1977 } 30689d5d6a2Sdrh 30789d5d6a2Sdrh /* Bonus points if the text encoding matches */ 308d36e1041Sdrh if( enc==(p->funcFlags & SQLITE_FUNC_ENCMASK) ){ 30989d5d6a2Sdrh match += 2; /* Exact encoding match */ 310d36e1041Sdrh }else if( (enc & p->funcFlags & 2)!=0 ){ 31189d5d6a2Sdrh match += 1; /* Both are UTF16, but with different byte orders */ 3128c0a791aSdanielk1977 } 31389d5d6a2Sdrh 3148c0a791aSdanielk1977 return match; 3158c0a791aSdanielk1977 } 3168c0a791aSdanielk1977 317fd9a0a45Sdanielk1977 /* 31870a8ca3cSdrh ** Search a FuncDefHash for a function with the given name. Return 31970a8ca3cSdrh ** a pointer to the matching FuncDef if found, or 0 if there is no match. 32070a8ca3cSdrh */ 32119efd0dbSdrh FuncDef *sqlite3FunctionSearch( 32270a8ca3cSdrh int h, /* Hash of the name */ 32380738d9cSdrh const char *zFunc /* Name of function */ 32470a8ca3cSdrh ){ 32570a8ca3cSdrh FuncDef *p; 32680738d9cSdrh for(p=sqlite3BuiltinFunctions.a[h]; p; p=p->u.pHash){ 32780738d9cSdrh if( sqlite3StrICmp(p->zName, zFunc)==0 ){ 32870a8ca3cSdrh return p; 32970a8ca3cSdrh } 33070a8ca3cSdrh } 33170a8ca3cSdrh return 0; 33270a8ca3cSdrh } 33370a8ca3cSdrh 33470a8ca3cSdrh /* 33570a8ca3cSdrh ** Insert a new FuncDef into a FuncDefHash hash table. 33670a8ca3cSdrh */ 33780738d9cSdrh void sqlite3InsertBuiltinFuncs( 33880738d9cSdrh FuncDef *aDef, /* List of global functions to be inserted */ 33980738d9cSdrh int nDef /* Length of the apDef[] list */ 34070a8ca3cSdrh ){ 34180738d9cSdrh int i; 34280738d9cSdrh for(i=0; i<nDef; i++){ 34370a8ca3cSdrh FuncDef *pOther; 34480738d9cSdrh const char *zName = aDef[i].zName; 34580738d9cSdrh int nName = sqlite3Strlen30(zName); 3468bee11a4Smistachkin int h = SQLITE_FUNC_HASH(zName[0], nName); 347ebaaa67dSdrh assert( zName[0]>='a' && zName[0]<='z' ); 34819efd0dbSdrh pOther = sqlite3FunctionSearch(h, zName); 34970a8ca3cSdrh if( pOther ){ 35080738d9cSdrh assert( pOther!=&aDef[i] && pOther->pNext!=&aDef[i] ); 35180738d9cSdrh aDef[i].pNext = pOther->pNext; 35280738d9cSdrh pOther->pNext = &aDef[i]; 35370a8ca3cSdrh }else{ 35480738d9cSdrh aDef[i].pNext = 0; 35580738d9cSdrh aDef[i].u.pHash = sqlite3BuiltinFunctions.a[h]; 35680738d9cSdrh sqlite3BuiltinFunctions.a[h] = &aDef[i]; 35780738d9cSdrh } 35870a8ca3cSdrh } 35970a8ca3cSdrh } 36070a8ca3cSdrh 36170a8ca3cSdrh 36270a8ca3cSdrh 36370a8ca3cSdrh /* 364fd9a0a45Sdanielk1977 ** Locate a user function given a name, a number of arguments and a flag 365fd9a0a45Sdanielk1977 ** indicating whether the function prefers UTF-16 over UTF-8. Return a 366fd9a0a45Sdanielk1977 ** pointer to the FuncDef structure that defines that function, or return 367fd9a0a45Sdanielk1977 ** NULL if the function does not exist. 368fd9a0a45Sdanielk1977 ** 369fd9a0a45Sdanielk1977 ** If the createFlag argument is true, then a new (blank) FuncDef 370fd9a0a45Sdanielk1977 ** structure is created and liked into the "db" structure if a 37189d5d6a2Sdrh ** no matching function previously existed. 372fd9a0a45Sdanielk1977 ** 37389d5d6a2Sdrh ** If nArg is -2, then the first valid function found is returned. A 3742d80151fSdrh ** function is valid if xSFunc is non-zero. The nArg==(-2) 37589d5d6a2Sdrh ** case is used to see if zName is a valid function name for some number 37689d5d6a2Sdrh ** of arguments. If nArg is -2, then createFlag must be 0. 377fd9a0a45Sdanielk1977 ** 378fd9a0a45Sdanielk1977 ** If createFlag is false, then a function with the required name and 379fd9a0a45Sdanielk1977 ** number of arguments may be returned even if the eTextRep flag does not 380fd9a0a45Sdanielk1977 ** match that requested. 381fd9a0a45Sdanielk1977 */ 382fd9a0a45Sdanielk1977 FuncDef *sqlite3FindFunction( 383fd9a0a45Sdanielk1977 sqlite3 *db, /* An open database */ 38480738d9cSdrh const char *zName, /* Name of the function. zero-terminated */ 385fd9a0a45Sdanielk1977 int nArg, /* Number of arguments. -1 means any number */ 386fd9a0a45Sdanielk1977 u8 enc, /* Preferred text encoding */ 38789d5d6a2Sdrh u8 createFlag /* Create new entry if true and does not otherwise exist */ 388fd9a0a45Sdanielk1977 ){ 389fd9a0a45Sdanielk1977 FuncDef *p; /* Iterator variable */ 390fd9a0a45Sdanielk1977 FuncDef *pBest = 0; /* Best match found so far */ 39170a8ca3cSdrh int bestScore = 0; /* Score of best match */ 39270a8ca3cSdrh int h; /* Hash value */ 39380738d9cSdrh int nName; /* Length of the name */ 394fd9a0a45Sdanielk1977 39589d5d6a2Sdrh assert( nArg>=(-2) ); 39689d5d6a2Sdrh assert( nArg>=(-1) || createFlag==0 ); 39780738d9cSdrh nName = sqlite3Strlen30(zName); 398fd9a0a45Sdanielk1977 399e3602be8Sdrh /* First search for a match amongst the application-defined functions. 400e3602be8Sdrh */ 40180738d9cSdrh p = (FuncDef*)sqlite3HashFind(&db->aFunc, zName); 40270a8ca3cSdrh while( p ){ 40370a8ca3cSdrh int score = matchQuality(p, nArg, enc); 40470a8ca3cSdrh if( score>bestScore ){ 405fd9a0a45Sdanielk1977 pBest = p; 40670a8ca3cSdrh bestScore = score; 407fd9a0a45Sdanielk1977 } 40870a8ca3cSdrh p = p->pNext; 409fd9a0a45Sdanielk1977 } 4108c0a791aSdanielk1977 411e3602be8Sdrh /* If no match is found, search the built-in functions. 412e3602be8Sdrh ** 4138257aa8dSdrh ** If the DBFLAG_PreferBuiltin flag is set, then search the built-in 414545f587fSdrh ** functions even if a prior app-defined function was found. And give 415545f587fSdrh ** priority to built-in functions. 416545f587fSdrh ** 417e3602be8Sdrh ** Except, if createFlag is true, that means that we are trying to 4186c5cecb6Sdrh ** install a new function. Whatever FuncDef structure is returned it will 419e3602be8Sdrh ** have fields overwritten with new information appropriate for the 420e3602be8Sdrh ** new function. But the FuncDefs for built-in functions are read-only. 421e3602be8Sdrh ** So we must not search for built-ins when creating a new function. 4228c0a791aSdanielk1977 */ 4238257aa8dSdrh if( !createFlag && (pBest==0 || (db->mDbFlags & DBFLAG_PreferBuiltin)!=0) ){ 424545f587fSdrh bestScore = 0; 4258bee11a4Smistachkin h = SQLITE_FUNC_HASH(sqlite3UpperToLower[(u8)zName[0]], nName); 42619efd0dbSdrh p = sqlite3FunctionSearch(h, zName); 42770a8ca3cSdrh while( p ){ 42870a8ca3cSdrh int score = matchQuality(p, nArg, enc); 42970a8ca3cSdrh if( score>bestScore ){ 43070a8ca3cSdrh pBest = p; 43170a8ca3cSdrh bestScore = score; 4328c0a791aSdanielk1977 } 43370a8ca3cSdrh p = p->pNext; 4348c0a791aSdanielk1977 } 435fd9a0a45Sdanielk1977 } 436fd9a0a45Sdanielk1977 437e3602be8Sdrh /* If the createFlag parameter is true and the search did not reveal an 438fd9a0a45Sdanielk1977 ** exact match for the name, number of arguments and encoding, then add a 439fd9a0a45Sdanielk1977 ** new entry to the hash table and return it. 440fd9a0a45Sdanielk1977 */ 44189d5d6a2Sdrh if( createFlag && bestScore<FUNC_PERFECT_MATCH && 4428c0a791aSdanielk1977 (pBest = sqlite3DbMallocZero(db, sizeof(*pBest)+nName+1))!=0 ){ 44380738d9cSdrh FuncDef *pOther; 44492011847Sdrh u8 *z; 4456ad224e9Sdrh pBest->zName = (const char*)&pBest[1]; 4461bd10f8aSdrh pBest->nArg = (u16)nArg; 447d36e1041Sdrh pBest->funcFlags = enc; 4486ad224e9Sdrh memcpy((char*)&pBest[1], zName, nName+1); 44992011847Sdrh for(z=(u8*)pBest->zName; *z; z++) *z = sqlite3UpperToLower[*z]; 45080738d9cSdrh pOther = (FuncDef*)sqlite3HashInsert(&db->aFunc, pBest->zName, pBest); 45180738d9cSdrh if( pOther==pBest ){ 45280738d9cSdrh sqlite3DbFree(db, pBest); 45380738d9cSdrh sqlite3OomFault(db); 45480738d9cSdrh return 0; 45580738d9cSdrh }else{ 45680738d9cSdrh pBest->pNext = pOther; 45780738d9cSdrh } 458fd9a0a45Sdanielk1977 } 459fd9a0a45Sdanielk1977 4602d80151fSdrh if( pBest && (pBest->xSFunc || createFlag) ){ 461fd9a0a45Sdanielk1977 return pBest; 462fd9a0a45Sdanielk1977 } 463fd9a0a45Sdanielk1977 return 0; 464fd9a0a45Sdanielk1977 } 46503b808a6Sdrh 46603b808a6Sdrh /* 46703b808a6Sdrh ** Free all resources held by the schema structure. The void* argument points 468633e6d57Sdrh ** at a Schema struct. This function does not call sqlite3DbFree(db, ) on the 469b6ee6607Sdrh ** pointer itself, it just cleans up subsidiary resources (i.e. the contents 47003b808a6Sdrh ** of the schema hash tables). 4718cf6c554Sdanielk1977 ** 4728cf6c554Sdanielk1977 ** The Schema.cache_size variable is not cleared. 47303b808a6Sdrh */ 474b6ee6607Sdrh void sqlite3SchemaClear(void *p){ 47503b808a6Sdrh Hash temp1; 47603b808a6Sdrh Hash temp2; 47703b808a6Sdrh HashElem *pElem; 47803b808a6Sdrh Schema *pSchema = (Schema *)p; 47903b808a6Sdrh 48003b808a6Sdrh temp1 = pSchema->tblHash; 48103b808a6Sdrh temp2 = pSchema->trigHash; 482e61922a6Sdrh sqlite3HashInit(&pSchema->trigHash); 48303b808a6Sdrh sqlite3HashClear(&pSchema->idxHash); 48403b808a6Sdrh for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){ 485633e6d57Sdrh sqlite3DeleteTrigger(0, (Trigger*)sqliteHashData(pElem)); 48603b808a6Sdrh } 48703b808a6Sdrh sqlite3HashClear(&temp2); 488e61922a6Sdrh sqlite3HashInit(&pSchema->tblHash); 48903b808a6Sdrh for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){ 49003b808a6Sdrh Table *pTab = sqliteHashData(pElem); 4911feeaed2Sdan sqlite3DeleteTable(0, pTab); 49203b808a6Sdrh } 49303b808a6Sdrh sqlite3HashClear(&temp1); 4941da40a38Sdan sqlite3HashClear(&pSchema->fkeyHash); 49503b808a6Sdrh pSchema->pSeqTab = 0; 4962c5e35ffSdrh if( pSchema->schemaFlags & DB_SchemaLoaded ){ 497c2a75551Sdrh pSchema->iGeneration++; 49803b808a6Sdrh } 499dc6b41edSdrh pSchema->schemaFlags &= ~(DB_SchemaLoaded|DB_ResetWanted); 500c2a75551Sdrh } 50103b808a6Sdrh 50203b808a6Sdrh /* 50303b808a6Sdrh ** Find and return the schema associated with a BTree. Create 50403b808a6Sdrh ** a new one if necessary. 50503b808a6Sdrh */ 50617435752Sdrh Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){ 50703b808a6Sdrh Schema * p; 50803b808a6Sdrh if( pBt ){ 509b6ee6607Sdrh p = (Schema *)sqlite3BtreeSchema(pBt, sizeof(Schema), sqlite3SchemaClear); 51003b808a6Sdrh }else{ 511b975598eSdrh p = (Schema *)sqlite3DbMallocZero(0, sizeof(Schema)); 51203b808a6Sdrh } 513a1644fd8Sdanielk1977 if( !p ){ 5144a642b60Sdrh sqlite3OomFault(db); 515a1644fd8Sdanielk1977 }else if ( 0==p->file_format ){ 516e61922a6Sdrh sqlite3HashInit(&p->tblHash); 517e61922a6Sdrh sqlite3HashInit(&p->idxHash); 518e61922a6Sdrh sqlite3HashInit(&p->trigHash); 5191da40a38Sdan sqlite3HashInit(&p->fkeyHash); 520f012ea3bSdrh p->enc = SQLITE_UTF8; 52103b808a6Sdrh } 52203b808a6Sdrh return p; 52303b808a6Sdrh } 524