/ Hex Artifact Content
Login

Artifact 732578f0fe4ce42d577e1c86dc89dd14a006ab52:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 2d 30 39 2d 32 31  /*.** 2014-09-21
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e  SQLite extension
0190: 20 61 64 64 73 20 61 20 64 65 62 75 67 20 22 61   adds a debug "a
01a0: 75 74 68 6f 72 69 7a 65 72 22 20 63 61 6c 6c 62  uthorizer" callb
01b0: 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62  ack to the datab
01c0: 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
01d0: 6e 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  n.  The callback
01e0: 20 6d 65 72 65 6c 79 20 77 72 69 74 65 73 20 74   merely writes t
01f0: 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  he authorization
0200: 20 72 65 71 75 65 73 74 20 74 6f 0a 2a 2a 20 73   request to.** s
0210: 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 20 61  tandard output a
0220: 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  nd returns SQLIT
0230: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  E_OK..**.** This
0240: 20 65 78 74 65 6e 73 69 6f 6e 20 63 61 6e 20 62   extension can b
0250: 65 20 75 73 65 64 20 28 66 6f 72 20 65 78 61 6d  e used (for exam
0260: 70 6c 65 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d  ple) in the comm
0270: 61 6e 64 2d 6c 69 6e 65 20 73 68 65 6c 6c 20 74  and-line shell t
0280: 6f 0a 2a 2a 20 74 72 61 63 65 20 74 68 65 20 6f  o.** trace the o
0290: 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
02a0: 61 75 74 68 6f 72 69 7a 65 72 2e 0a 2a 2f 0a 23  authorizer..*/.#
02b0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
02c0: 65 78 74 2e 68 22 0a 53 51 4c 49 54 45 5f 45 58  ext.h".SQLITE_EX
02d0: 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 69  TENSION_INIT1.#i
02e0: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
02f0: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20  ../*.** Display 
0300: 74 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  the authorizatio
0310: 6e 20 72 65 71 75 65 73 74 0a 2a 2f 0a 73 74 61  n request.*/.sta
0320: 74 69 63 20 69 6e 74 20 61 75 74 68 43 61 6c 6c  tic int authCall
0330: 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43  back(.  void *pC
0340: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 69 6e 74  lientData,.  int
0350: 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   op,.  const cha
0360: 72 20 2a 7a 31 2c 0a 20 20 63 6f 6e 73 74 20 63  r *z1,.  const c
0370: 68 61 72 20 2a 7a 32 2c 0a 20 20 63 6f 6e 73 74  har *z2,.  const
0380: 20 63 68 61 72 20 2a 7a 33 2c 0a 20 20 63 6f 6e   char *z3,.  con
0390: 73 74 20 63 68 61 72 20 2a 7a 34 0a 29 7b 0a 20  st char *z4.){. 
03a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
03b0: 3b 0a 20 20 63 68 61 72 20 7a 4f 70 53 70 61 63  ;.  char zOpSpac
03c0: 65 5b 35 30 5d 3b 0a 20 20 73 77 69 74 63 68 28  e[50];.  switch(
03d0: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
03e0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
03f0: 44 45 58 3a 20 20 20 20 20 20 20 20 7a 4f 70 20  DEX:        zOp 
0400: 3d 20 22 43 52 45 41 54 45 5f 49 4e 44 45 58 22  = "CREATE_INDEX"
0410: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
0420: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0430: 43 52 45 41 54 45 5f 54 41 42 4c 45 3a 20 20 20  CREATE_TABLE:   
0440: 20 20 20 20 20 7a 4f 70 20 3d 20 22 43 52 45 41       zOp = "CREA
0450: 54 45 5f 54 41 42 4c 45 22 3b 20 20 20 20 20 20  TE_TABLE";      
0460: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0470: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
0480: 54 45 4d 50 5f 49 4e 44 45 58 3a 20 20 20 7a 4f  TEMP_INDEX:   zO
0490: 70 20 3d 20 22 43 52 45 41 54 45 5f 54 45 4d 50  p = "CREATE_TEMP
04a0: 5f 49 4e 44 45 58 22 3b 20 20 20 62 72 65 61 6b  _INDEX";   break
04b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
04c0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
04d0: 42 4c 45 3a 20 20 20 7a 4f 70 20 3d 20 22 43 52  BLE:   zOp = "CR
04e0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22  EATE_TEMP_TABLE"
04f0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
0500: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
0510: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20  E_TEMP_TRIGGER: 
0520: 7a 4f 70 20 3d 20 22 43 52 45 41 54 45 5f 54 45  zOp = "CREATE_TE
0530: 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  MP_TRIGGER"; bre
0540: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0550: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
0560: 56 49 45 57 3a 20 20 20 20 7a 4f 70 20 3d 20 22  VIEW:    zOp = "
0570: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
0580: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
0590: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
05a0: 41 54 45 5f 54 52 49 47 47 45 52 3a 20 20 20 20  ATE_TRIGGER:    
05b0: 20 20 7a 4f 70 20 3d 20 22 43 52 45 41 54 45 5f    zOp = "CREATE_
05c0: 54 52 49 47 47 45 52 22 3b 20 20 20 20 20 20 62  TRIGGER";      b
05d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
05e0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
05f0: 57 3a 20 20 20 20 20 20 20 20 20 7a 4f 70 20 3d  W:         zOp =
0600: 20 22 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20   "CREATE_VIEW"; 
0610: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
0620: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
0630: 45 4c 45 54 45 3a 20 20 20 20 20 20 20 20 20 20  ELETE:          
0640: 20 20 20 20 7a 4f 70 20 3d 20 22 44 45 4c 45 54      zOp = "DELET
0650: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  E";             
0660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0670: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
0680: 45 58 3a 20 20 20 20 20 20 20 20 20 20 7a 4f 70  EX:          zOp
0690: 20 3d 20 22 44 52 4f 50 5f 49 4e 44 45 58 22 3b   = "DROP_INDEX";
06a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
06b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
06c0: 5f 44 52 4f 50 5f 54 41 42 4c 45 3a 20 20 20 20  _DROP_TABLE:    
06d0: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 44 52 4f        zOp = "DRO
06e0: 50 5f 54 41 42 4c 45 22 3b 20 20 20 20 20 20 20  P_TABLE";       
06f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0700: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
0710: 45 4d 50 5f 49 4e 44 45 58 3a 20 20 20 20 20 7a  EMP_INDEX:     z
0720: 4f 70 20 3d 20 22 44 52 4f 50 5f 54 45 4d 50 5f  Op = "DROP_TEMP_
0730: 49 4e 44 45 58 22 3b 20 20 20 20 20 62 72 65 61  INDEX";     brea
0740: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0750: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
0760: 4c 45 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 44  LE:     zOp = "D
0770: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b  ROP_TEMP_TABLE";
0780: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0790: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
07a0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 20  _TEMP_TRIGGER:  
07b0: 20 7a 4f 70 20 3d 20 22 44 52 4f 50 5f 54 45 4d   zOp = "DROP_TEM
07c0: 50 5f 54 52 49 47 47 45 52 22 3b 20 20 20 62 72  P_TRIGGER";   br
07d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
07e0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
07f0: 49 45 57 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  IEW:      zOp = 
0800: 22 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22  "DROP_TEMP_VIEW"
0810: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
0820: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
0830: 4f 50 5f 54 52 49 47 47 45 52 3a 20 20 20 20 20  OP_TRIGGER:     
0840: 20 20 20 7a 4f 70 20 3d 20 22 44 52 4f 50 5f 54     zOp = "DROP_T
0850: 52 49 47 47 45 52 22 3b 20 20 20 20 20 20 20 20  RIGGER";        
0860: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0870: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
0880: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4f 70 20  :           zOp 
0890: 3d 20 22 44 52 4f 50 5f 56 49 45 57 22 3b 20 20  = "DROP_VIEW";  
08a0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
08b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
08c0: 49 4e 53 45 52 54 3a 20 20 20 20 20 20 20 20 20  INSERT:         
08d0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 4e 53 45       zOp = "INSE
08e0: 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RT";            
08f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0900: 65 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 3a  e SQLITE_PRAGMA:
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f                zO
0920: 70 20 3d 20 22 50 52 41 47 4d 41 22 3b 20 20 20  p = "PRAGMA";   
0930: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
0940: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0950: 45 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20 20  E_READ:         
0960: 20 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45         zOp = "RE
0970: 41 44 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  AD";            
0980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0990: 61 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  ase SQLITE_SELEC
09a0: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T:              
09b0: 7a 4f 70 20 3d 20 22 53 45 4c 45 43 54 22 3b 20  zOp = "SELECT"; 
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
09d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
09e0: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a  ITE_TRANSACTION:
09f0: 20 20 20 20 20 20 20 20 20 7a 4f 70 20 3d 20 22           zOp = "
0a00: 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b 20 20 20  TRANSACTION";   
0a10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0a20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44   case SQLITE_UPD
0a30: 41 54 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ATE:            
0a40: 20 20 7a 4f 70 20 3d 20 22 55 50 44 41 54 45 22    zOp = "UPDATE"
0a50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
0a60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0a70: 51 4c 49 54 45 5f 41 54 54 41 43 48 3a 20 20 20  QLITE_ATTACH:   
0a80: 20 20 20 20 20 20 20 20 20 20 20 7a 4f 70 20 3d             zOp =
0a90: 20 22 41 54 54 41 43 48 22 3b 20 20 20 20 20 20   "ATTACH";      
0aa0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
0ab0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
0ac0: 45 54 41 43 48 3a 20 20 20 20 20 20 20 20 20 20  ETACH:          
0ad0: 20 20 20 20 7a 4f 70 20 3d 20 22 44 45 54 41 43      zOp = "DETAC
0ae0: 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  H";             
0af0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0b00: 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41   SQLITE_ALTER_TA
0b10: 42 4c 45 3a 20 20 20 20 20 20 20 20 20 7a 4f 70  BLE:         zOp
0b20: 20 3d 20 22 41 4c 54 45 52 5f 54 41 42 4c 45 22   = "ALTER_TABLE"
0b30: 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;         break;
0b40: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0b50: 5f 52 45 49 4e 44 45 58 3a 20 20 20 20 20 20 20  _REINDEX:       
0b60: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45 49        zOp = "REI
0b70: 4e 44 45 58 22 3b 20 20 20 20 20 20 20 20 20 20  NDEX";          
0b80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0b90: 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a  se SQLITE_ANALYZ
0ba0: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  E:             z
0bb0: 4f 70 20 3d 20 22 41 4e 41 4c 59 5a 45 22 3b 20  Op = "ANALYZE"; 
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
0bd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0be0: 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45  TE_CREATE_VTABLE
0bf0: 3a 20 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 43  :       zOp = "C
0c00: 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b 20 20  REATE_VTABLE";  
0c10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0c20: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
0c30: 5f 56 54 41 42 4c 45 3a 20 20 20 20 20 20 20 20  _VTABLE:        
0c40: 20 7a 4f 70 20 3d 20 22 44 52 4f 50 5f 56 54 41   zOp = "DROP_VTA
0c50: 42 4c 45 22 3b 20 20 20 20 20 20 20 20 20 62 72  BLE";         br
0c60: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0c70: 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 3a 20 20  LITE_FUNCTION:  
0c80: 20 20 20 20 20 20 20 20 20 20 7a 4f 70 20 3d 20            zOp = 
0c90: 22 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20  "FUNCTION";     
0ca0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0cb0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 41    case SQLITE_SA
0cc0: 56 45 50 4f 49 4e 54 3a 20 20 20 20 20 20 20 20  VEPOINT:        
0cd0: 20 20 20 7a 4f 70 20 3d 20 22 53 41 56 45 50 4f     zOp = "SAVEPO
0ce0: 49 4e 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  INT";           
0cf0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0d00: 53 51 4c 49 54 45 5f 43 4f 50 59 3a 20 20 20 20  SQLITE_COPY:    
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 70 20              zOp 
0d20: 3d 20 22 43 4f 50 59 22 3b 20 20 20 20 20 20 20  = "COPY";       
0d30: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
0d40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0d50: 52 45 43 55 52 53 49 56 45 3a 20 20 20 20 20 20  RECURSIVE:      
0d60: 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45 43 55       zOp = "RECU
0d70: 52 53 49 56 45 22 3b 20 20 20 20 20 20 20 20 20  RSIVE";         
0d80: 20 20 62 72 65 61 6b 3b 0a 0a 0a 20 20 20 20 64    break;...    d
0d90: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
0da0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
0db0: 28 73 69 7a 65 6f 66 28 7a 4f 70 53 70 61 63 65  (sizeof(zOpSpace
0dc0: 29 2c 20 7a 4f 70 53 70 61 63 65 2c 20 22 25 64  ), zOpSpace, "%d
0dd0: 22 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 7a 4f  ", op);.      zO
0de0: 70 20 3d 20 7a 4f 70 53 70 61 63 65 3b 0a 20 20  p = zOpSpace;.  
0df0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0e00: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 31 3d 3d 30  .  }.  if( z1==0
0e10: 20 29 20 7a 31 20 3d 20 22 4e 55 4c 4c 22 3b 0a   ) z1 = "NULL";.
0e20: 20 20 69 66 28 20 7a 32 3d 3d 30 20 29 20 7a 32    if( z2==0 ) z2
0e30: 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 69 66 28   = "NULL";.  if(
0e40: 20 7a 33 3d 3d 30 20 29 20 7a 33 20 3d 20 22 4e   z3==0 ) z3 = "N
0e50: 55 4c 4c 22 3b 0a 20 20 69 66 28 20 7a 34 3d 3d  ULL";.  if( z4==
0e60: 30 20 29 20 7a 34 20 3d 20 22 4e 55 4c 4c 22 3b  0 ) z4 = "NULL";
0e70: 0a 20 20 70 72 69 6e 74 66 28 22 41 55 54 48 3a  .  printf("AUTH:
0e80: 20 25 73 2c 25 73 2c 25 73 2c 25 73 2c 25 73 5c   %s,%s,%s,%s,%s\
0e90: 6e 22 2c 20 7a 4f 70 2c 20 7a 31 2c 20 7a 32 2c  n", zOp, z1, z2,
0ea0: 20 7a 33 2c 20 7a 34 29 3b 0a 20 20 72 65 74 75   z3, z4);.  retu
0eb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
0ec0: 0a 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32  ...#ifdef _WIN32
0ed0: 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
0ee0: 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e  xport).#endif.in
0ef0: 74 20 73 71 6c 69 74 65 33 5f 73 68 6f 77 61 75  t sqlite3_showau
0f00: 74 68 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74  th_init(.  sqlit
0f10: 65 33 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20  e3 *db, .  char 
0f20: 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63  **pzErrMsg, .  c
0f30: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
0f40: 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a  _routines *pApi.
0f50: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
0f60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 51 4c 49 54  LITE_OK;.  SQLIT
0f70: 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54  E_EXTENSION_INIT
0f80: 32 28 70 41 70 69 29 3b 0a 20 20 28 76 6f 69 64  2(pApi);.  (void
0f90: 29 70 7a 45 72 72 4d 73 67 3b 20 20 2f 2a 20 55  )pzErrMsg;  /* U
0fa0: 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 20  nused parameter 
0fb0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
0fc0: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
0fd0: 28 64 62 2c 20 61 75 74 68 43 61 6c 6c 62 61 63  (db, authCallbac
0fe0: 6b 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  k, 0);.  return 
0ff0: 72 63 3b 0a 7d 0a                                rc;.}.