/ Hex Artifact Content
Login

Artifact 72c656fbc1a20ec426a94cd80cda5eea5b7b8bc7:


0000: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ./*.** This file
0010: 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 74 61 6e   contains a stan
0020: 64 61 6c 6f 6e 65 20 70 72 6f 67 72 61 6d 20 75  dalone program u
0030: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
0040: 43 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69  C code that.** i
0050: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 73 74 61 74  mplements a stat
0060: 69 63 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  ic hash table to
0070: 20 73 74 6f 72 65 20 74 68 65 20 64 65 66 69 6e   store the defin
0080: 69 74 69 6f 6e 73 20 6f 66 20 62 75 69 6c 74 2d  itions of built-
0090: 69 6e 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  in.** SQL functi
00a0: 6f 6e 73 20 69 6e 20 53 51 4c 69 74 65 2e 20 0a  ons in SQLite. .
00b0: 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  */..#include <st
00c0: 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  dio.h>.#include 
00d0: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
00e0: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a  ude <assert.h>..
00f0: 2f 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 69 74 65  /*.** The SQLite
0100: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 22 66 75   source file "fu
0110: 6e 63 2e 63 22 20 69 73 20 69 6e 63 6c 75 64 65  nc.c" is include
0120: 64 20 62 65 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 42  d below..**.** B
0130: 79 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 34  y defining the 4
0140: 20 6d 61 63 72 6f 73 20 61 6e 64 20 74 79 70 65   macros and type
0150: 64 65 66 20 62 65 6c 6f 77 20 62 65 66 6f 72 65  def below before
0160: 20 69 6e 63 6c 75 64 69 6e 67 20 22 66 75 6e 63   including "func
0170: 2e 63 22 2c 0a 2a 2a 20 6d 6f 73 74 20 6f 66 20  .c",.** most of 
0180: 74 68 65 20 63 6f 64 65 20 69 73 20 65 78 63 6c  the code is excl
0190: 75 64 65 64 2e 20 57 68 61 74 20 69 73 20 6c 65  uded. What is le
01a0: 66 74 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  ft is an array o
01b0: 66 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 73 74  f constant.** st
01c0: 72 69 6e 67 73 2c 20 61 42 75 69 6c 74 69 6e 46  rings, aBuiltinF
01d0: 75 6e 63 5b 5d 2c 20 63 6f 6e 74 61 69 6e 69 6e  unc[], containin
01e0: 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 53  g the names of S
01f0: 51 4c 69 74 65 27 73 20 62 75 69 6c 74 2d 69 6e  QLite's built-in
0200: 20 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f   .** SQL functio
0210: 6e 73 2e 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20  ns. i.e.:.**.** 
0220: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 61 42 75    const char aBu
0230: 69 6c 74 69 6e 46 75 6e 63 5b 5d 20 3d 20 7b 20  iltinFunc[] = { 
0240: 22 6c 69 6b 65 22 2c 20 22 67 6c 6f 62 22 2c 20  "like", "glob", 
0250: 22 6d 69 6e 22 2c 20 22 6d 61 78 22 20 2e 2e 2e  "min", "max" ...
0260: 20 7d 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61   };.**.** The da
0270: 74 61 20 66 72 6f 6d 20 61 42 75 69 6c 74 69 6e  ta from aBuiltin
0280: 46 75 6e 63 5b 5d 20 69 73 20 75 73 65 64 20 62  Func[] is used b
0290: 79 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20 74  y this program t
02a0: 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20  o create the.** 
02b0: 73 74 61 74 69 63 20 68 61 73 68 20 74 61 62 6c  static hash tabl
02c0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 52  e..*/.#define CR
02d0: 45 41 54 45 5f 42 55 49 4c 54 49 4e 5f 48 41 53  EATE_BUILTIN_HAS
02e0: 48 54 41 42 4c 45 20 31 0a 23 64 65 66 69 6e 65  HTABLE 1.#define
02f0: 20 46 55 4e 43 54 49 4f 4e 28 7a 4e 61 6d 65 2c   FUNCTION(zName,
0300: 77 2c 78 2c 79 2c 7a 29 20 20 20 20 23 7a 4e 61  w,x,y,z)    #zNa
0310: 6d 65 0a 23 64 65 66 69 6e 65 20 41 47 47 52 45  me.#define AGGRE
0320: 47 41 54 45 28 7a 4e 61 6d 65 2c 76 2c 77 2c 78  GATE(zName,v,w,x
0330: 2c 79 2c 7a 29 20 23 7a 4e 61 6d 65 0a 23 64 65  ,y,z) #zName.#de
0340: 66 69 6e 65 20 4c 49 4b 45 46 55 4e 43 28 7a 4e  fine LIKEFUNC(zN
0350: 61 6d 65 2c 78 2c 79 2c 7a 29 20 20 20 20 20 20  ame,x,y,z)      
0360: 23 7a 4e 61 6d 65 0a 23 64 65 66 69 6e 65 20 46  #zName.#define F
0370: 75 6e 63 44 65 66 20 63 6f 6e 73 74 20 63 68 61  uncDef const cha
0380: 72 20 2a 0a 0a 23 69 6e 63 6c 75 64 65 20 22 66  r *..#include "f
0390: 75 6e 63 2e 63 22 0a 0a 2f 2a 20 54 68 65 20 6e  unc.c"../* The n
03a0: 75 6d 62 65 72 20 6f 66 20 62 75 63 6b 65 74 73  umber of buckets
03b0: 20 69 6e 20 74 68 65 20 73 74 61 74 69 63 20 68   in the static h
03c0: 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 23 64  ash table. */.#d
03d0: 65 66 69 6e 65 20 48 41 53 48 53 49 5a 45 20 31  efine HASHSIZE 1
03e0: 32 37 0a 0a 74 79 70 65 64 65 66 20 75 6e 73 69  27..typedef unsi
03f0: 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 0a 2f  gned char u8;../
0400: 2a 20 41 6e 20 61 72 72 61 79 20 74 6f 20 6d 61  * An array to ma
0410: 70 20 61 6c 6c 20 75 70 70 65 72 2d 63 61 73 65  p all upper-case
0420: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f   characters into
0430: 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
0440: 64 69 6e 67 0a 2a 2a 20 6c 6f 77 65 72 2d 63 61  ding.** lower-ca
0450: 73 65 20 63 68 61 72 61 63 74 65 72 2e 20 0a 2a  se character. .*
0460: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
0470: 38 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  8 sqlite3UpperTo
0480: 4c 6f 77 65 72 5b 5d 20 3d 20 7b 0a 20 20 20 20  Lower[] = {.    
0490: 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c    0,  1,  2,  3,
04a0: 20 20 34 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c    4,  5,  6,  7,
04b0: 20 20 38 2c 20 20 39 2c 20 31 30 2c 20 31 31 2c    8,  9, 10, 11,
04c0: 20 31 32 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c   12, 13, 14, 15,
04d0: 20 31 36 2c 20 31 37 2c 0a 20 20 20 20 20 31 38   16, 17,.     18
04e0: 2c 20 31 39 2c 20 32 30 2c 20 32 31 2c 20 32 32  , 19, 20, 21, 22
04f0: 2c 20 32 33 2c 20 32 34 2c 20 32 35 2c 20 32 36  , 23, 24, 25, 26
0500: 2c 20 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30  , 27, 28, 29, 30
0510: 2c 20 33 31 2c 20 33 32 2c 20 33 33 2c 20 33 34  , 31, 32, 33, 34
0520: 2c 20 33 35 2c 0a 20 20 20 20 20 33 36 2c 20 33  , 35,.     36, 3
0530: 37 2c 20 33 38 2c 20 33 39 2c 20 34 30 2c 20 34  7, 38, 39, 40, 4
0540: 31 2c 20 34 32 2c 20 34 33 2c 20 34 34 2c 20 34  1, 42, 43, 44, 4
0550: 35 2c 20 34 36 2c 20 34 37 2c 20 34 38 2c 20 34  5, 46, 47, 48, 4
0560: 39 2c 20 35 30 2c 20 35 31 2c 20 35 32 2c 20 35  9, 50, 51, 52, 5
0570: 33 2c 0a 20 20 20 20 20 35 34 2c 20 35 35 2c 20  3,.     54, 55, 
0580: 35 36 2c 20 35 37 2c 20 35 38 2c 20 35 39 2c 20  56, 57, 58, 59, 
0590: 36 30 2c 20 36 31 2c 20 36 32 2c 20 36 33 2c 20  60, 61, 62, 63, 
05a0: 36 34 2c 20 39 37 2c 20 39 38 2c 20 39 39 2c 31  64, 97, 98, 99,1
05b0: 30 30 2c 31 30 31 2c 31 30 32 2c 31 30 33 2c 0a  00,101,102,103,.
05c0: 20 20 20 20 31 30 34 2c 31 30 35 2c 31 30 36 2c      104,105,106,
05d0: 31 30 37 2c 31 30 38 2c 31 30 39 2c 31 31 30 2c  107,108,109,110,
05e0: 31 31 31 2c 31 31 32 2c 31 31 33 2c 31 31 34 2c  111,112,113,114,
05f0: 31 31 35 2c 31 31 36 2c 31 31 37 2c 31 31 38 2c  115,116,117,118,
0600: 31 31 39 2c 31 32 30 2c 31 32 31 2c 0a 20 20 20  119,120,121,.   
0610: 20 31 32 32 2c 20 39 31 2c 20 39 32 2c 20 39 33   122, 91, 92, 93
0620: 2c 20 39 34 2c 20 39 35 2c 20 39 36 2c 20 39 37  , 94, 95, 96, 97
0630: 2c 20 39 38 2c 20 39 39 2c 31 30 30 2c 31 30 31  , 98, 99,100,101
0640: 2c 31 30 32 2c 31 30 33 2c 31 30 34 2c 31 30 35  ,102,103,104,105
0650: 2c 31 30 36 2c 31 30 37 2c 0a 20 20 20 20 31 30  ,106,107,.    10
0660: 38 2c 31 30 39 2c 31 31 30 2c 31 31 31 2c 31 31  8,109,110,111,11
0670: 32 2c 31 31 33 2c 31 31 34 2c 31 31 35 2c 31 31  2,113,114,115,11
0680: 36 2c 31 31 37 2c 31 31 38 2c 31 31 39 2c 31 32  6,117,118,119,12
0690: 30 2c 31 32 31 2c 31 32 32 2c 31 32 33 2c 31 32  0,121,122,123,12
06a0: 34 2c 31 32 35 2c 0a 20 20 20 20 31 32 36 2c 31  4,125,.    126,1
06b0: 32 37 2c 31 32 38 2c 31 32 39 2c 31 33 30 2c 31  27,128,129,130,1
06c0: 33 31 2c 31 33 32 2c 31 33 33 2c 31 33 34 2c 31  31,132,133,134,1
06d0: 33 35 2c 31 33 36 2c 31 33 37 2c 31 33 38 2c 31  35,136,137,138,1
06e0: 33 39 2c 31 34 30 2c 31 34 31 2c 31 34 32 2c 31  39,140,141,142,1
06f0: 34 33 2c 0a 20 20 20 20 31 34 34 2c 31 34 35 2c  43,.    144,145,
0700: 31 34 36 2c 31 34 37 2c 31 34 38 2c 31 34 39 2c  146,147,148,149,
0710: 31 35 30 2c 31 35 31 2c 31 35 32 2c 31 35 33 2c  150,151,152,153,
0720: 31 35 34 2c 31 35 35 2c 31 35 36 2c 31 35 37 2c  154,155,156,157,
0730: 31 35 38 2c 31 35 39 2c 31 36 30 2c 31 36 31 2c  158,159,160,161,
0740: 0a 20 20 20 20 31 36 32 2c 31 36 33 2c 31 36 34  .    162,163,164
0750: 2c 31 36 35 2c 31 36 36 2c 31 36 37 2c 31 36 38  ,165,166,167,168
0760: 2c 31 36 39 2c 31 37 30 2c 31 37 31 2c 31 37 32  ,169,170,171,172
0770: 2c 31 37 33 2c 31 37 34 2c 31 37 35 2c 31 37 36  ,173,174,175,176
0780: 2c 31 37 37 2c 31 37 38 2c 31 37 39 2c 0a 20 20  ,177,178,179,.  
0790: 20 20 31 38 30 2c 31 38 31 2c 31 38 32 2c 31 38    180,181,182,18
07a0: 33 2c 31 38 34 2c 31 38 35 2c 31 38 36 2c 31 38  3,184,185,186,18
07b0: 37 2c 31 38 38 2c 31 38 39 2c 31 39 30 2c 31 39  7,188,189,190,19
07c0: 31 2c 31 39 32 2c 31 39 33 2c 31 39 34 2c 31 39  1,192,193,194,19
07d0: 35 2c 31 39 36 2c 31 39 37 2c 0a 20 20 20 20 31  5,196,197,.    1
07e0: 39 38 2c 31 39 39 2c 32 30 30 2c 32 30 31 2c 32  98,199,200,201,2
07f0: 30 32 2c 32 30 33 2c 32 30 34 2c 32 30 35 2c 32  02,203,204,205,2
0800: 30 36 2c 32 30 37 2c 32 30 38 2c 32 30 39 2c 32  06,207,208,209,2
0810: 31 30 2c 32 31 31 2c 32 31 32 2c 32 31 33 2c 32  10,211,212,213,2
0820: 31 34 2c 32 31 35 2c 0a 20 20 20 20 32 31 36 2c  14,215,.    216,
0830: 32 31 37 2c 32 31 38 2c 32 31 39 2c 32 32 30 2c  217,218,219,220,
0840: 32 32 31 2c 32 32 32 2c 32 32 33 2c 32 32 34 2c  221,222,223,224,
0850: 32 32 35 2c 32 32 36 2c 32 32 37 2c 32 32 38 2c  225,226,227,228,
0860: 32 32 39 2c 32 33 30 2c 32 33 31 2c 32 33 32 2c  229,230,231,232,
0870: 32 33 33 2c 0a 20 20 20 20 32 33 34 2c 32 33 35  233,.    234,235
0880: 2c 32 33 36 2c 32 33 37 2c 32 33 38 2c 32 33 39  ,236,237,238,239
0890: 2c 32 34 30 2c 32 34 31 2c 32 34 32 2c 32 34 33  ,240,241,242,243
08a0: 2c 32 34 34 2c 32 34 35 2c 32 34 36 2c 32 34 37  ,244,245,246,247
08b0: 2c 32 34 38 2c 32 34 39 2c 32 35 30 2c 32 35 31  ,248,249,250,251
08c0: 2c 0a 20 20 20 20 32 35 32 2c 32 35 33 2c 32 35  ,.    252,253,25
08d0: 34 2c 32 35 35 0a 7d 3b 0a 23 64 65 66 69 6e 65  4,255.};.#define
08e0: 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 20 73 71   UpperToLower sq
08f0: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
0900: 72 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 74  r..int sqlite3St
0910: 72 49 43 6d 70 28 63 6f 6e 73 74 20 63 68 61 72  rICmp(const char
0920: 20 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73 74 20 63   *zLeft, const c
0930: 68 61 72 20 2a 7a 52 69 67 68 74 29 7b 0a 20 20  har *zRight){.  
0940: 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65  register unsigne
0950: 64 20 63 68 61 72 20 2a 61 2c 20 2a 62 3b 0a 20  d char *a, *b;. 
0960: 20 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63   a = (unsigned c
0970: 68 61 72 20 2a 29 7a 4c 65 66 74 3b 0a 20 20 62  har *)zLeft;.  b
0980: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
0990: 72 20 2a 29 7a 52 69 67 68 74 3b 0a 20 20 77 68  r *)zRight;.  wh
09a0: 69 6c 65 28 20 2a 61 21 3d 30 20 26 26 20 55 70  ile( *a!=0 && Up
09b0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d 3d 3d  perToLower[*a]==
09c0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d  UpperToLower[*b]
09d0: 29 7b 20 61 2b 2b 3b 20 62 2b 2b 3b 20 7d 0a 20  ){ a++; b++; }. 
09e0: 20 72 65 74 75 72 6e 20 55 70 70 65 72 54 6f 4c   return UpperToL
09f0: 6f 77 65 72 5b 2a 61 5d 20 2d 20 55 70 70 65 72  ower[*a] - Upper
0a00: 54 6f 4c 6f 77 65 72 5b 2a 62 5d 3b 0a 7d 0a 0a  ToLower[*b];.}..
0a10: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 68 73  static int hashs
0a20: 74 72 69 6e 67 28 63 6f 6e 73 74 20 63 68 61 72  tring(const char
0a30: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
0a40: 69 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  ii;.  unsigned i
0a50: 6e 74 20 69 4b 65 79 20 3d 20 30 3b 0a 20 20 66  nt iKey = 0;.  f
0a60: 6f 72 28 69 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69  or(ii=0; zName[i
0a70: 69 5d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  i]; ii++){.    i
0a80: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 33 29 20  Key = (iKey<<3) 
0a90: 2b 20 28 75 38 29 73 71 6c 69 74 65 33 55 70 70  + (u8)sqlite3Upp
0aa0: 65 72 54 6f 4c 6f 77 65 72 5b 28 75 38 29 7a 4e  erToLower[(u8)zN
0ab0: 61 6d 65 5b 69 69 5d 5d 3b 0a 20 20 7d 0a 20 20  ame[ii]];.  }.  
0ac0: 69 4b 65 79 20 3d 20 69 4b 65 79 25 48 41 53 48  iKey = iKey%HASH
0ad0: 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 69  SIZE;.  return i
0ae0: 4b 65 79 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  Key;.}..static v
0af0: 6f 69 64 20 70 72 69 6e 74 61 72 72 61 79 28 63  oid printarray(c
0b00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
0b10: 2c 20 75 38 20 2a 61 41 72 72 61 79 2c 20 69 6e  , u8 *aArray, in
0b20: 74 20 6e 41 72 72 61 79 29 7b 0a 20 20 69 6e 74  t nArray){.  int
0b30: 20 69 69 3b 0a 20 20 70 72 69 6e 74 66 28 22 20   ii;.  printf(" 
0b40: 20 73 74 61 74 69 63 20 75 38 20 25 73 5b 25 64   static u8 %s[%d
0b50: 5d 20 3d 20 7b 22 2c 20 7a 4e 61 6d 65 2c 20 6e  ] = {", zName, n
0b60: 41 72 72 61 79 29 3b 0a 20 20 66 6f 72 28 69 69  Array);.  for(ii
0b70: 3d 30 3b 20 69 69 3c 6e 41 72 72 61 79 3b 20 69  =0; ii<nArray; i
0b80: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 69  i++){.    if( (i
0b90: 69 25 31 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i%16)==0 ){.    
0ba0: 20 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20 20    printf("\n    
0bb0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72  ");.    }.    pr
0bc0: 69 6e 74 66 28 22 25 32 64 2c 20 22 2c 20 61 41  intf("%2d, ", aA
0bd0: 72 72 61 79 5b 69 69 5d 29 3b 0a 20 20 7d 0a 20  rray[ii]);.  }. 
0be0: 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 7d 3b 5c   printf("\n  };\
0bf0: 6e 22 29 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d 61 69  n");.}...int mai
0c00: 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  n(int argc, char
0c10: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20   **argv){.  int 
0c20: 6e 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20  nFunc;          
0c30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0c40: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
0c50: 61 42 75 69 6c 74 69 6e 46 75 6e 63 20 61 72 72  aBuiltinFunc arr
0c60: 61 79 20 2a 2f 0a 0a 20 20 75 38 20 61 6e 46 75  ay */..  u8 anFu
0c70: 6e 63 5b 32 35 36 5d 3b 0a 20 20 75 38 20 61 48  nc[256];.  u8 aH
0c80: 61 73 68 5b 48 41 53 48 53 49 5a 45 5d 3b 0a 20  ash[HASHSIZE];. 
0c90: 20 75 38 20 61 4e 65 78 74 5b 32 35 36 5d 3b 0a   u8 aNext[256];.
0ca0: 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
0cb0: 69 48 65 61 64 3b 0a 0a 20 20 6e 46 75 6e 63 20  iHead;..  nFunc 
0cc0: 3d 20 28 73 69 7a 65 6f 66 28 61 42 75 69 6c 74  = (sizeof(aBuilt
0cd0: 69 6e 46 75 6e 63 29 2f 73 69 7a 65 6f 66 28 63  inFunc)/sizeof(c
0ce0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 29 3b 0a 20  onst char *));. 
0cf0: 20 61 73 73 65 72 74 28 6e 46 75 6e 63 3c 32 35   assert(nFunc<25
0d00: 36 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 61 48  6);..  memset(aH
0d10: 61 73 68 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ash, (unsigned c
0d20: 68 61 72 29 6e 46 75 6e 63 2c 20 73 69 7a 65 6f  har)nFunc, sizeo
0d30: 66 28 61 48 61 73 68 29 29 3b 0a 20 20 6d 65 6d  f(aHash));.  mem
0d40: 73 65 74 28 61 4e 65 78 74 2c 20 28 75 6e 73 69  set(aNext, (unsi
0d50: 67 6e 65 64 20 63 68 61 72 29 6e 46 75 6e 63 2c  gned char)nFunc,
0d60: 20 73 69 7a 65 6f 66 28 61 4e 65 78 74 29 29 3b   sizeof(aNext));
0d70: 0a 20 20 6d 65 6d 73 65 74 28 61 6e 46 75 6e 63  .  memset(anFunc
0d80: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 6e 46 75  , 0, sizeof(anFu
0d90: 6e 63 29 29 3b 0a 0a 20 20 69 48 65 61 64 20 3d  nc));..  iHead =
0da0: 20 2d 31 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b   -1;.  for(ii=0;
0db0: 20 69 69 3c 6e 46 75 6e 63 3b 20 69 69 2b 2b 29   ii<nFunc; ii++)
0dc0: 7b 0a 20 20 20 20 69 6e 74 20 69 48 61 73 68 3b  {.    int iHash;
0dd0: 0a 0a 20 20 20 20 69 66 28 20 69 48 65 61 64 3e  ..    if( iHead>
0de0: 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  =0 && 0==sqlite3
0df0: 53 74 72 49 43 6d 70 28 61 42 75 69 6c 74 69 6e  StrICmp(aBuiltin
0e00: 46 75 6e 63 5b 69 69 5d 2c 20 61 42 75 69 6c 74  Func[ii], aBuilt
0e10: 69 6e 46 75 6e 63 5b 69 48 65 61 64 5d 29 20 29  inFunc[iHead]) )
0e20: 7b 0a 20 20 20 20 20 20 61 6e 46 75 6e 63 5b 69  {.      anFunc[i
0e30: 48 65 61 64 5d 2b 2b 3b 0a 20 20 20 20 20 20 63  Head]++;.      c
0e40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c  ontinue;.    }el
0e50: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  se{.      /* The
0e60: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
0e70: 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 67 72  ed by this progr
0e80: 61 6d 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  am assumes that 
0e90: 69 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  if there are.   
0ea0: 20 20 20 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72     ** two or mor
0eb0: 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
0ec0: 20 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 5d 20   aBuiltinFunc[] 
0ed0: 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 73  array with the s
0ee0: 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 6e 61 6d  ame.      ** nam
0ef0: 65 20 28 69 2e 65 2e 20 74 77 6f 20 76 65 72 73  e (i.e. two vers
0f00: 69 6f 6e 73 20 6f 66 20 74 68 65 20 22 6d 61 78  ions of the "max
0f10: 22 20 66 75 6e 63 74 69 6f 6e 29 2c 20 74 68 65  " function), the
0f20: 6e 20 74 68 65 79 20 6d 75 73 74 0a 20 20 20 20  n they must.    
0f30: 20 20 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69    ** be stored i
0f40: 6e 20 61 64 6a 61 63 65 6e 74 20 73 6c 6f 74 73  n adjacent slots
0f50: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
0f60: 62 6c 6f 63 6b 20 64 65 74 65 63 74 73 20 74 68  block detects th
0f70: 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c  e.      ** probl
0f80: 65 6d 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  em if this is no
0f90: 74 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20  t the case..    
0fa0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a    */.      int j
0fb0: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  j;.      for(jj=
0fc0: 30 3b 20 6a 6a 3c 69 69 3b 20 6a 6a 2b 2b 29 7b  0; jj<ii; jj++){
0fd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
0fe0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61  sqlite3StrICmp(a
0ff0: 42 75 69 6c 74 69 6e 46 75 6e 63 5b 69 69 5d 2c  BuiltinFunc[ii],
1000: 20 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 6a 6a   aBuiltinFunc[jj
1010: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
1020: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
1030: 22 45 72 72 6f 72 20 69 6e 20 66 75 6e 63 2e 63  "Error in func.c
1040: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  \n");.          
1050: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1060: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1070: 20 20 20 20 69 48 65 61 64 20 3d 20 69 69 3b 0a      iHead = ii;.
1080: 20 20 20 20 20 20 61 6e 46 75 6e 63 5b 69 48 65        anFunc[iHe
1090: 61 64 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ad] = 1;.    }..
10a0: 20 20 20 20 69 48 61 73 68 20 3d 20 68 61 73 68      iHash = hash
10b0: 73 74 72 69 6e 67 28 61 42 75 69 6c 74 69 6e 46  string(aBuiltinF
10c0: 75 6e 63 5b 69 69 5d 29 3b 0a 20 20 20 20 69 66  unc[ii]);.    if
10d0: 28 20 61 48 61 73 68 5b 69 48 61 73 68 5d 21 3d  ( aHash[iHash]!=
10e0: 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69  nFunc ){.      i
10f0: 6e 74 20 69 4e 65 78 74 20 3d 20 61 48 61 73 68  nt iNext = aHash
1100: 5b 69 48 61 73 68 5d 3b 0a 20 20 20 20 20 20 77  [iHash];.      w
1110: 68 69 6c 65 28 20 61 4e 65 78 74 5b 69 4e 65 78  hile( aNext[iNex
1120: 74 5d 21 3d 6e 46 75 6e 63 20 29 7b 0a 20 20 20  t]!=nFunc ){.   
1130: 20 20 20 20 20 69 4e 65 78 74 20 3d 20 61 4e 65       iNext = aNe
1140: 78 74 5b 69 4e 65 78 74 5d 3b 0a 20 20 20 20 20  xt[iNext];.     
1150: 20 7d 0a 20 20 20 20 20 20 61 4e 65 78 74 5b 69   }.      aNext[i
1160: 4e 65 78 74 5d 20 3d 20 69 69 3b 0a 20 20 20 20  Next] = ii;.    
1170: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 48 61  }else{.      aHa
1180: 73 68 5b 69 48 61 73 68 5d 20 3d 20 69 69 3b 0a  sh[iHash] = ii;.
1190: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 72 69      }.  }..  pri
11a0: 6e 74 66 28 0a 20 20 22 2f 2a 2a 2a 2a 2a 2a 2a  ntf(.  "/*******
11b0: 20 41 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 47   Automatically G
11c0: 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 2d 20  enerated code - 
11d0: 64 6f 20 6e 6f 74 20 65 64 69 74 20 2a 2a 2a 2a  do not edit ****
11e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 0a 20  **********/\n". 
11f0: 20 22 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74   "int sqlite3Get
1200: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 28  BuiltinFunction(
1210: 5c 6e 22 0a 20 20 22 20 20 63 6f 6e 73 74 20 63  \n".  "  const c
1220: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 5c 6e  har *zName,   \n
1230: 22 0a 20 20 22 20 20 69 6e 74 20 6e 4e 61 6d 65  ".  "  int nName
1240: 2c 20 5c 6e 22 0a 20 20 22 20 20 46 75 6e 63 44  , \n".  "  FuncD
1250: 65 66 20 2a 2a 70 61 46 75 6e 63 5c 6e 22 0a 20  ef **paFunc\n". 
1260: 20 22 29 7b 5c 6e 22 0a 20 20 29 3b 0a 0a 20 20   "){\n".  );..  
1270: 70 72 69 6e 74 61 72 72 61 79 28 22 61 48 61 73  printarray("aHas
1280: 68 22 2c 20 61 48 61 73 68 2c 20 48 41 53 48 53  h", aHash, HASHS
1290: 49 5a 45 29 3b 0a 20 20 70 72 69 6e 74 61 72 72  IZE);.  printarr
12a0: 61 79 28 22 61 6e 46 75 6e 63 22 2c 20 61 6e 46  ay("anFunc", anF
12b0: 75 6e 63 2c 20 6e 46 75 6e 63 29 3b 0a 20 20 70  unc, nFunc);.  p
12c0: 72 69 6e 74 61 72 72 61 79 28 22 61 4e 65 78 74  rintarray("aNext
12d0: 22 2c 20 61 4e 65 78 74 2c 20 6e 46 75 6e 63 29  ", aNext, nFunc)
12e0: 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20 46 75  ;.  printf("  Fu
12f0: 6e 63 44 65 66 20 2a 70 4e 6f 46 75 6e 63 20 3d  ncDef *pNoFunc =
1300: 20 26 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 25   &aBuiltinFunc[%
1310: 64 5d 3b 5c 6e 22 2c 20 6e 46 75 6e 63 29 3b 0a  d];\n", nFunc);.
1320: 0a 20 20 70 72 69 6e 74 66 28 0a 20 20 22 20 20  .  printf(.  "  
1330: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4b 65  unsigned int iKe
1340: 79 20 3d 20 30 3b 20 20 2f 2a 20 48 61 73 68 20  y = 0;  /* Hash 
1350: 6f 66 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74  of case-insensit
1360: 69 76 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  ive string zName
1370: 2e 20 2a 2f 5c 6e 22 0a 20 20 22 20 20 69 6e 74  . */\n".  "  int
1380: 20 69 69 3b 5c 6e 22 0a 20 20 22 20 20 46 75 6e   ii;\n".  "  Fun
1390: 63 44 65 66 20 2a 70 46 75 6e 63 3b 5c 6e 22 0a  cDef *pFunc;\n".
13a0: 20 20 22 5c 6e 22 0a 20 20 29 3b 0a 20 20 70 72    "\n".  );.  pr
13b0: 69 6e 74 66 28 0a 20 20 22 20 20 61 73 73 65 72  intf(.  "  asser
13c0: 74 28 20 28 73 69 7a 65 6f 66 28 61 42 75 69 6c  t( (sizeof(aBuil
13d0: 74 69 6e 46 75 6e 63 29 2f 73 69 7a 65 6f 66 28  tinFunc)/sizeof(
13e0: 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 30 5d 29  aBuiltinFunc[0])
13f0: 29 3d 3d 25 64 20 29 3b 5c 6e 22 2c 20 6e 46 75  )==%d );\n", nFu
1400: 6e 63 0a 20 20 29 3b 0a 20 20 70 72 69 6e 74 66  nc.  );.  printf
1410: 28 0a 20 20 22 20 20 2f 2a 20 47 65 6e 65 72 61  (.  "  /* Genera
1420: 74 65 20 74 68 65 20 68 61 73 68 20 6f 66 20 7a  te the hash of z
1430: 4e 61 6d 65 20 2a 2f 5c 6e 22 0a 20 20 22 20 20  Name */\n".  "  
1440: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 4e 61  for(ii=0; ii<nNa
1450: 6d 65 3b 20 69 69 2b 2b 29 7b 5c 6e 22 0a 20 20  me; ii++){\n".  
1460: 22 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65  "    iKey = (iKe
1470: 79 3c 3c 33 29 20 2b 20 28 75 38 29 73 71 6c 69  y<<3) + (u8)sqli
1480: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
1490: 28 75 38 29 7a 4e 61 6d 65 5b 69 69 5d 5d 3b 5c  (u8)zName[ii]];\
14a0: 6e 22 0a 20 20 22 20 20 7d 5c 6e 22 0a 20 20 22  n".  "  }\n".  "
14b0: 20 20 69 4b 65 79 20 3d 20 69 4b 65 79 25 25 31    iKey = iKey%%1
14c0: 32 37 3b 5c 6e 22 0a 20 20 22 5c 6e 22 0a 20 20  27;\n".  "\n".  
14d0: 22 20 20 70 46 75 6e 63 20 3d 20 26 61 42 75 69  "  pFunc = &aBui
14e0: 6c 74 69 6e 46 75 6e 63 5b 69 4b 65 79 20 3d 20  ltinFunc[iKey = 
14f0: 61 48 61 73 68 5b 69 4b 65 79 5d 5d 3b 5c 6e 22  aHash[iKey]];\n"
1500: 0a 20 20 22 20 20 77 68 69 6c 65 28 20 70 46 75  .  "  while( pFu
1510: 6e 63 21 3d 70 4e 6f 46 75 6e 63 20 26 26 20 73  nc!=pNoFunc && s
1520: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
1530: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  Func->zName, zNa
1540: 6d 65 2c 20 6e 4e 61 6d 65 29 20 29 7b 5c 6e 22  me, nName) ){\n"
1550: 0a 20 20 22 20 20 20 20 70 46 75 6e 63 20 3d 20  .  "    pFunc = 
1560: 26 61 42 75 69 6c 74 69 6e 46 75 6e 63 5b 69 4b  &aBuiltinFunc[iK
1570: 65 79 20 3d 20 61 4e 65 78 74 5b 69 4b 65 79 5d  ey = aNext[iKey]
1580: 5d 3b 5c 6e 22 0a 20 20 22 20 20 7d 5c 6e 22 0a  ];\n".  "  }\n".
1590: 20 20 22 5c 6e 22 0a 20 20 22 20 20 2a 70 61 46    "\n".  "  *paF
15a0: 75 6e 63 20 3d 20 70 46 75 6e 63 3b 5c 6e 22 0a  unc = pFunc;\n".
15b0: 20 20 22 20 20 72 65 74 75 72 6e 20 61 6e 46 75    "  return anFu
15c0: 6e 63 5b 69 4b 65 79 5d 3b 5c 6e 22 0a 20 20 22  nc[iKey];\n".  "
15d0: 7d 5c 6e 22 0a 20 20 29 3b 0a 0a 20 20 72 65 74  }\n".  );..  ret
15e0: 75 72 6e 20 30 3b 0a 7d 0a                       urn 0;.}.