System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 79c975b123c91716827f62cefe0504663f5202cd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 4a 61 6e 75 61  /*.** 2003 Janua
0010: 72 79 20 31 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ry 11.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u give..**.*****
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 20 54 68 69 73 20 66 69 6c  ****.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  e contains code 
0190: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
01a0: 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 65  t the sqlite3_se
01b0: 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 29 0a 2a  t_authorizer().*
01c0: 2a 20 41 50 49 2e 20 20 54 68 69 73 20 66 61 63  * API.  This fac
01d0: 69 6c 69 74 79 20 69 73 20 61 6e 20 6f 70 74 69  ility is an opti
01e0: 6f 6e 61 6c 20 66 65 61 74 75 72 65 20 6f 66 20  onal feature of 
01f0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 45 6d  the library.  Em
0200: 62 65 64 64 65 64 0a 2a 2a 20 73 79 73 74 65 6d  bedded.** system
0210: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 6e 65  s that do not ne
0220: 65 64 20 74 68 69 73 20 66 61 63 69 6c 69 74 79  ed this facility
0230: 20 6d 61 79 20 6f 6d 69 74 20 69 74 20 62 79 20   may omit it by 
0240: 72 65 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 74  recompiling.** t
0250: 68 65 20 6c 69 62 72 61 72 79 20 77 69 74 68 20  he library with 
0260: 2d 44 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  -DSQLITE_OMIT_AU
0270: 54 48 4f 52 49 5a 41 54 49 4f 4e 3d 31 0a 2a 2a  THORIZATION=1.**
0280: 0a 2a 2a 20 24 49 64 3a 20 61 75 74 68 2e 63 2c  .** $Id: auth.c,
0290: 76 20 31 2e 32 35 20 32 30 30 37 2f 30 31 2f 33  v 1.25 2007/01/3
02a0: 30 20 31 35 3a 32 30 3a 34 37 20 72 6d 73 69 6d  0 15:20:47 rmsim
02b0: 70 73 6f 6e 20 45 78 70 20 24 0a 2a 2f 0a 23 69  pson Exp $.*/.#i
02c0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02d0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20  t.h"../*.** All 
02e0: 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e 20 74  of the code in t
02f0: 68 69 73 20 66 69 6c 65 20 6d 61 79 20 62 65 20  his file may be 
0300: 6f 6d 69 74 74 65 64 20 62 79 20 64 65 66 69 6e  omitted by defin
0310: 69 6e 67 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  ing a single.** 
0320: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 6e 64 65  macro..*/.#ifnde
0330: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0340: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 0a 2f 2a 0a  THORIZATION../*.
0350: 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20  ** Set or clear 
0360: 74 68 65 20 61 63 63 65 73 73 20 61 75 74 68 6f  the access autho
0370: 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  rization functio
0380: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 63  n..**.** The acc
0390: 65 73 73 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ess authorizatio
03a0: 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  n function is be
03b0: 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 74   called during t
03c0: 68 65 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 0a 2a  he compilation.*
03d0: 2a 20 70 68 61 73 65 20 74 6f 20 76 65 72 69 66  * phase to verif
03e0: 79 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20  y that the user 
03f0: 68 61 73 20 72 65 61 64 20 61 6e 64 2f 6f 72 20  has read and/or 
0400: 77 72 69 74 65 20 61 63 63 65 73 73 20 70 65 72  write access per
0410: 6d 69 73 73 69 6f 6e 20 6f 6e 0a 2a 2a 20 76 61  mission on.** va
0420: 72 69 6f 75 73 20 66 69 65 6c 64 73 20 6f 66 20  rious fields of 
0430: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
0440: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
0450: 74 20 74 6f 20 74 68 65 20 61 75 74 68 20 66 75  t to the auth fu
0460: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 63  nction.** is a c
0470: 6f 70 79 20 6f 66 20 74 68 65 20 33 72 64 20 61  opy of the 3rd a
0480: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
0490: 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 65  routine.  The se
04a0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
04b0: 20 74 6f 20 74 68 65 20 61 75 74 68 20 66 75 6e   to the auth fun
04c0: 63 74 69 6f 6e 20 69 73 20 6f 6e 65 20 6f 66 20  ction is one of 
04d0: 74 68 65 73 65 20 63 6f 6e 73 74 61 6e 74 73 3a  these constants:
04e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c  .**.**       SQL
04f0: 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
0500: 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c 49 54 45  .**       SQLITE
0510: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 0a 2a 2a  _CREATE_TABLE.**
0520: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52         SQLITE_CR
0530: 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 0a  EATE_TEMP_INDEX.
0540: 2a 2a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  **       SQLITE_
0550: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
0560: 45 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c 49 54  E.**       SQLIT
0570: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52  E_CREATE_TEMP_TR
0580: 49 47 47 45 52 0a 2a 2a 20 20 20 20 20 20 20 53  IGGER.**       S
0590: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
05a0: 50 5f 56 49 45 57 0a 2a 2a 20 20 20 20 20 20 20  P_VIEW.**       
05b0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
05c0: 49 47 47 45 52 0a 2a 2a 20 20 20 20 20 20 20 53  IGGER.**       S
05d0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
05e0: 57 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c 49 54  W.**       SQLIT
05f0: 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20  E_DELETE.**     
0600: 20 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e    SQLITE_DROP_IN
0610: 44 45 58 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c  DEX.**       SQL
0620: 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 0a 2a  ITE_DROP_TABLE.*
0630: 2a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44  *       SQLITE_D
0640: 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 0a 2a  ROP_TEMP_INDEX.*
0650: 2a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44  *       SQLITE_D
0660: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 0a 2a  ROP_TEMP_TABLE.*
0670: 2a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44  *       SQLITE_D
0680: 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ROP_TEMP_TRIGGER
0690: 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c 49 54 45  .**       SQLITE
06a0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 0a  _DROP_TEMP_VIEW.
06b0: 2a 2a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  **       SQLITE_
06c0: 44 52 4f 50 5f 54 52 49 47 47 45 52 0a 2a 2a 20  DROP_TRIGGER.** 
06d0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 52 4f        SQLITE_DRO
06e0: 50 5f 56 49 45 57 0a 2a 2a 20 20 20 20 20 20 20  P_VIEW.**       
06f0: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 0a 2a 2a  SQLITE_INSERT.**
0700: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50 52         SQLITE_PR
0710: 41 47 4d 41 0a 2a 2a 20 20 20 20 20 20 20 53 51  AGMA.**       SQ
0720: 4c 49 54 45 5f 52 45 41 44 0a 2a 2a 20 20 20 20  LITE_READ.**    
0730: 20 20 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54     SQLITE_SELECT
0740: 0a 2a 2a 20 20 20 20 20 20 20 53 51 4c 49 54 45  .**       SQLITE
0750: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20  _TRANSACTION.** 
0760: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 50 44        SQLITE_UPD
0770: 41 54 45 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68  ATE.**.** The th
0780: 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20 61  ird and fourth a
0790: 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
07a0: 61 75 74 68 20 66 75 6e 63 74 69 6f 6e 20 61 72  auth function ar
07b0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  e the name of.**
07c0: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74   the table and t
07d0: 68 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61  he column that a
07e0: 72 65 20 62 65 69 6e 67 20 61 63 63 65 73 73 65  re being accesse
07f0: 64 2e 20 20 54 68 65 20 61 75 74 68 20 66 75 6e  d.  The auth fun
0800: 63 74 69 6f 6e 0a 2a 2a 20 73 68 6f 75 6c 64 20  ction.** should 
0810: 72 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  return either SQ
0820: 4c 49 54 45 5f 4f 4b 2c 20 53 51 4c 49 54 45 5f  LITE_OK, SQLITE_
0830: 44 45 4e 59 2c 20 6f 72 20 53 51 4c 49 54 45 5f  DENY, or SQLITE_
0840: 49 47 4e 4f 52 45 2e 20 20 49 66 0a 2a 2a 20 53  IGNORE.  If.** S
0850: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
0860: 72 6e 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74  rned, it means t
0870: 68 61 74 20 61 63 63 65 73 73 20 69 73 20 61 6c  hat access is al
0880: 6c 6f 77 65 64 2e 20 20 53 51 4c 49 54 45 5f 44  lowed.  SQLITE_D
0890: 45 4e 59 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  ENY.** means tha
08a0: 74 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  t the SQL statem
08b0: 65 6e 74 20 77 69 6c 6c 20 6e 65 76 65 72 2d 72  ent will never-r
08c0: 75 6e 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33  un - the sqlite3
08d0: 5f 65 78 65 63 28 29 20 63 61 6c 6c 0a 2a 2a 20  _exec() call.** 
08e0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 77 69 74 68  will return with
08f0: 20 61 6e 20 65 72 72 6f 72 2e 20 20 53 51 4c 49   an error.  SQLI
0900: 54 45 5f 49 47 4e 4f 52 45 20 6d 65 61 6e 73 20  TE_IGNORE means 
0910: 74 68 61 74 20 74 68 65 20 53 51 4c 20 73 74 61  that the SQL sta
0920: 74 65 6d 65 6e 74 0a 2a 2a 20 73 68 6f 75 6c 64  tement.** should
0930: 20 72 75 6e 20 62 75 74 20 61 74 74 65 6d 70 74   run but attempt
0940: 73 20 74 6f 20 72 65 61 64 20 74 68 65 20 73 70  s to read the sp
0950: 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 77  ecified column w
0960: 69 6c 6c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a  ill return NULL.
0970: 2a 2a 20 61 6e 64 20 61 74 74 65 6d 70 74 73 20  ** and attempts 
0980: 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 6f 6c  to write the col
0990: 75 6d 6e 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  umn will be igno
09a0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69  red..**.** Setti
09b0: 6e 67 20 74 68 65 20 61 75 74 68 20 66 75 6e 63  ng the auth func
09c0: 74 69 6f 6e 20 74 6f 20 4e 55 4c 4c 20 64 69 73  tion to NULL dis
09d0: 61 62 6c 65 73 20 74 68 69 73 20 68 6f 6f 6b 2e  ables this hook.
09e0: 20 20 54 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a    The default.**
09f0: 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20   setting of the 
0a00: 61 75 74 68 20 66 75 6e 63 74 69 6f 6e 20 69 73  auth function is
0a10: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e 74 20 73 71   NULL..*/.int sq
0a20: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
0a30: 69 7a 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  izer(.  sqlite3 
0a40: 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 41 75  *db,.  int (*xAu
0a50: 74 68 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  th)(void*,int,co
0a60: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
0a70: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
0a80: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a  *,const char*),.
0a90: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
0aa0: 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41    db->xAuth = xA
0ab0: 75 74 68 3b 0a 20 20 64 62 2d 3e 70 41 75 74 68  uth;.  db->pAuth
0ac0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
0ad0: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
0ae0: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
0af0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
0b00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
0b10: 57 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  Write an error m
0b20: 65 73 73 61 67 65 20 69 6e 74 6f 20 70 50 61 72  essage into pPar
0b30: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 74 68 61 74  se->zErrMsg that
0b40: 20 65 78 70 6c 61 69 6e 73 20 74 68 61 74 20 74   explains that t
0b50: 68 65 0a 2a 2a 20 75 73 65 72 2d 73 75 70 70 6c  he.** user-suppl
0b60: 69 65 64 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ied authorizatio
0b70: 6e 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  n function retur
0b80: 6e 65 64 20 61 6e 20 69 6c 6c 65 67 61 6c 20 76  ned an illegal v
0b90: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
0ba0: 76 6f 69 64 20 73 71 6c 69 74 65 41 75 74 68 42  void sqliteAuthB
0bb0: 61 64 52 65 74 75 72 6e 43 6f 64 65 28 50 61 72  adReturnCode(Par
0bc0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
0bd0: 72 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 72  rc){.  sqlite3Er
0be0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
0bf0: 69 6c 6c 65 67 61 6c 20 72 65 74 75 72 6e 20 76  illegal return v
0c00: 61 6c 75 65 20 28 25 64 29 20 66 72 6f 6d 20 74  alue (%d) from t
0c10: 68 65 20 22 0a 20 20 20 20 22 61 75 74 68 6f 72  he ".    "author
0c20: 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
0c30: 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 53 51 4c   - should be SQL
0c40: 49 54 45 5f 4f 4b 2c 20 53 51 4c 49 54 45 5f 49  ITE_OK, SQLITE_I
0c50: 47 4e 4f 52 45 2c 20 22 0a 20 20 20 20 22 6f 72  GNORE, ".    "or
0c60: 20 53 51 4c 49 54 45 5f 44 45 4e 59 22 2c 20 72   SQLITE_DENY", r
0c70: 63 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 72 63  c);.  pParse->rc
0c80: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
0c90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 45  .}../*.** The pE
0ca0: 78 70 72 20 73 68 6f 75 6c 64 20 62 65 20 61 20  xpr should be a 
0cb0: 54 4b 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73  TK_COLUMN expres
0cc0: 73 69 6f 6e 2e 20 20 54 68 65 20 74 61 62 6c 65  sion.  The table
0cd0: 20 72 65 66 65 72 72 65 64 20 74 6f 0a 2a 2a 20   referred to.** 
0ce0: 69 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 6f  is in pTabList o
0cf0: 72 20 65 6c 73 65 20 69 74 20 69 73 20 74 68 65  r else it is the
0d00: 20 4e 45 57 20 6f 72 20 4f 4c 44 20 74 61 62 6c   NEW or OLD tabl
0d10: 65 20 6f 66 20 61 20 74 72 69 67 67 65 72 2e 20  e of a trigger. 
0d20: 20 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65   .** Check to se
0d30: 65 20 69 66 20 69 74 20 69 73 20 4f 4b 20 74 6f  e if it is OK to
0d40: 20 72 65 61 64 20 74 68 69 73 20 70 61 72 74 69   read this parti
0d50: 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  cular column..**
0d60: 0a 2a 2a 20 49 66 20 74 68 65 20 61 75 74 68 20  .** If the auth 
0d70: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
0d80: 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20   SQLITE_IGNORE, 
0d90: 63 68 61 6e 67 65 20 74 68 65 20 54 4b 5f 43 4f  change the TK_CO
0da0: 4c 55 4d 4e 20 0a 2a 2a 20 69 6e 73 74 72 75 63  LUMN .** instruc
0db0: 74 69 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 4e  tion into a TK_N
0dc0: 55 4c 4c 2e 20 20 49 66 20 74 68 65 20 61 75 74  ULL.  If the aut
0dd0: 68 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  h function retur
0de0: 6e 73 20 53 51 4c 49 54 45 5f 44 45 4e 59 2c 0a  ns SQLITE_DENY,.
0df0: 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65  ** then generate
0e00: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 76 6f   an error..*/.vo
0e10: 69 64 20 73 71 6c 69 74 65 33 41 75 74 68 52 65  id sqlite3AuthRe
0e20: 61 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ad(.  Parse *pPa
0e30: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
0e40: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
0e50: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
0e60: 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pr,          /* 
0e70: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
0e80: 6f 20 63 68 65 63 6b 20 61 75 74 68 6f 72 69 7a  o check authoriz
0e90: 61 74 69 6f 6e 20 6f 6e 20 2a 2f 0a 20 20 53 72  ation on */.  Sr
0ea0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
0eb0: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
0ec0: 20 74 68 61 74 20 70 45 78 70 72 20 6d 69 67 68   that pExpr migh
0ed0: 74 20 72 65 66 65 72 20 74 6f 20 2a 2f 0a 29 7b  t refer to */.){
0ee0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0ef0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
0f00: 6e 74 20 72 63 3b 0a 20 20 54 61 62 6c 65 20 2a  nt rc;.  Table *
0f10: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 2f  pTab;          /
0f20: 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
0f30: 67 20 72 65 61 64 20 2a 2f 0a 20 20 63 6f 6e 73  g read */.  cons
0f40: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 20 20 20  t char *zCol;   
0f50: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
0f60: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
0f70: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  able */.  int iS
0f80: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
0f90: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 54 61 62  /* Index in pTab
0fa0: 4c 69 73 74 2d 3e 61 5b 5d 20 6f 66 20 74 61 62  List->a[] of tab
0fb0: 6c 65 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  le being read */
0fc0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0fd0: 44 42 61 73 65 3b 20 20 20 2f 2a 20 4e 61 6d 65  DBase;   /* Name
0fe0: 20 6f 66 20 64 61 74 61 62 61 73 65 20 62 65 69   of database bei
0ff0: 6e 67 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20  ng accessed */. 
1000: 20 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70   TriggerStack *p
1010: 53 74 61 63 6b 3b 20 2f 2a 20 54 68 65 20 73 74  Stack; /* The st
1020: 61 63 6b 20 6f 66 20 63 75 72 72 65 6e 74 20 74  ack of current t
1030: 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74  riggers */.  int
1040: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
1050: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
1060: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1070: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
1080: 65 66 65 72 73 20 74 6f 20 2a 2f 0a 0a 20 20 69  efers to */..  i
1090: 66 28 20 64 62 2d 3e 78 41 75 74 68 3d 3d 30 20  f( db->xAuth==0 
10a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
10b0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53  pExpr->op==TK_AS
10c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
10d0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
10e0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 69  TK_COLUMN );.  i
10f0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
1100: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
1110: 2d 3e 64 62 2c 20 70 45 78 70 72 2d 3e 70 53 63  ->db, pExpr->pSc
1120: 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 69 44 62  hema);.  if( iDb
1130: 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  <0 ){.    /* An 
1140: 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  attempt to read 
1150: 61 20 63 6f 6c 75 6d 6e 20 6f 75 74 20 6f 66 20  a column out of 
1160: 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 6f 74  a subquery or ot
1170: 68 65 72 0a 20 20 20 20 2a 2a 20 74 65 6d 70 6f  her.    ** tempo
1180: 72 61 72 79 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  rary table. */. 
1190: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
11a0: 20 66 6f 72 28 69 53 72 63 3d 30 3b 20 70 54 61   for(iSrc=0; pTa
11b0: 62 4c 69 73 74 20 26 26 20 69 53 72 63 3c 70 54  bList && iSrc<pT
11c0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 53  abList->nSrc; iS
11d0: 72 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rc++){.    if( p
11e0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 54  Expr->iTable==pT
11f0: 61 62 4c 69 73 74 2d 3e 61 5b 69 53 72 63 5d 2e  abList->a[iSrc].
1200: 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
1210: 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 72 63 3e  .  }.  if( iSrc>
1220: 3d 30 20 26 26 20 70 54 61 62 4c 69 73 74 20 26  =0 && pTabList &
1230: 26 20 69 53 72 63 3c 70 54 61 62 4c 69 73 74 2d  & iSrc<pTabList-
1240: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 70 54 61  >nSrc ){.    pTa
1250: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
1260: 69 53 72 63 5d 2e 70 54 61 62 3b 0a 20 20 7d 65  iSrc].pTab;.  }e
1270: 6c 73 65 20 69 66 28 20 28 70 53 74 61 63 6b 20  lse if( (pStack 
1280: 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  = pParse->trigSt
1290: 61 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f  ack)!=0 ){.    /
12a0: 2a 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 61  * This must be a
12b0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61  n attempt to rea
12c0: 64 20 74 68 65 20 4e 45 57 20 6f 72 20 4f 4c 44  d the NEW or OLD
12d0: 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 0a 20   pseudo-tables. 
12e0: 20 20 20 2a 2a 20 6f 66 20 61 20 74 72 69 67 67     ** of a trigg
12f0: 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  er..    */.    a
1300: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
1310: 61 62 6c 65 3d 3d 70 53 74 61 63 6b 2d 3e 6e 65  able==pStack->ne
1320: 77 49 64 78 20 7c 7c 20 70 45 78 70 72 2d 3e 69  wIdx || pExpr->i
1330: 54 61 62 6c 65 3d 3d 70 53 74 61 63 6b 2d 3e 6f  Table==pStack->o
1340: 6c 64 49 64 78 20 29 3b 0a 20 20 20 20 70 54 61  ldIdx );.    pTa
1350: 62 20 3d 20 70 53 74 61 63 6b 2d 3e 70 54 61 62  b = pStack->pTab
1360: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1370: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
1380: 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
1390: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
13a0: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
13b0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
13c0: 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >iColumn<pTab->n
13d0: 43 6f 6c 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 20  Col );.    zCol 
13e0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  = pTab->aCol[pEx
13f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61  pr->iColumn].zNa
1400: 6d 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  me;.  }else if( 
1410: 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29  pTab->iPKey>=0 )
1420: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
1430: 61 62 2d 3e 69 50 4b 65 79 3c 70 54 61 62 2d 3e  ab->iPKey<pTab->
1440: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 7a 43 6f 6c  nCol );.    zCol
1450: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54   = pTab->aCol[pT
1460: 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65  ab->iPKey].zName
1470: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
1480: 43 6f 6c 20 3d 20 22 52 4f 57 49 44 22 3b 0a 20  Col = "ROWID";. 
1490: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62   }.  assert( iDb
14a0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
14b0: 44 62 20 29 3b 0a 20 20 7a 44 42 61 73 65 20 3d  Db );.  zDBase =
14c0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
14d0: 61 6d 65 3b 0a 20 20 72 63 20 3d 20 64 62 2d 3e  ame;.  rc = db->
14e0: 78 41 75 74 68 28 64 62 2d 3e 70 41 75 74 68 41  xAuth(db->pAuthA
14f0: 72 67 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c  rg, SQLITE_READ,
1500: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
1510: 6f 6c 2c 20 7a 44 42 61 73 65 2c 20 0a 20 20 20  ol, zDBase, .   
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1530: 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1540: 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  xt);.  if( rc==S
1550: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 20 29 7b 0a  QLITE_IGNORE ){.
1560: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1570: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
1580: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1590: 44 45 4e 59 20 29 7b 0a 20 20 20 20 69 66 28 20  DENY ){.    if( 
15a0: 64 62 2d 3e 6e 44 62 3e 32 20 7c 7c 20 69 44 62  db->nDb>2 || iDb
15b0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
15c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15d0: 72 73 65 2c 20 22 61 63 63 65 73 73 20 74 6f 20  rse, "access to 
15e0: 25 73 2e 25 73 2e 25 73 20 69 73 20 70 72 6f 68  %s.%s.%s is proh
15f0: 69 62 69 74 65 64 22 2c 20 0a 20 20 20 20 20 20  ibited", .      
1600: 20 20 20 7a 44 42 61 73 65 2c 20 70 54 61 62 2d     zDBase, pTab-
1610: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20  >zName, zCol);. 
1620: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1630: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1640: 70 50 61 72 73 65 2c 20 22 61 63 63 65 73 73 20  pParse, "access 
1650: 74 6f 20 25 73 2e 25 73 20 69 73 20 70 72 6f 68  to %s.%s is proh
1660: 69 62 69 74 65 64 22 2c 70 54 61 62 2d 3e 7a 4e  ibited",pTab->zN
1670: 61 6d 65 2c 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  ame,zCol);.    }
1680: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1690: 3d 20 53 51 4c 49 54 45 5f 41 55 54 48 3b 0a 20  = SQLITE_AUTH;. 
16a0: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
16b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16c0: 73 71 6c 69 74 65 41 75 74 68 42 61 64 52 65 74  sqliteAuthBadRet
16d0: 75 72 6e 43 6f 64 65 28 70 50 61 72 73 65 2c 20  urnCode(pParse, 
16e0: 72 63 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rc);.  }.}../*.*
16f0: 2a 20 44 6f 20 61 6e 20 61 75 74 68 6f 72 69 7a  * Do an authoriz
1700: 61 74 69 6f 6e 20 63 68 65 63 6b 20 75 73 69 6e  ation check usin
1710: 67 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 61  g the code and a
1720: 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 2e 20  rguments given. 
1730: 20 52 65 74 75 72 6e 0a 2a 2a 20 65 69 74 68 65   Return.** eithe
1740: 72 20 53 51 4c 49 54 45 5f 4f 4b 20 28 7a 65 72  r SQLITE_OK (zer
1750: 6f 29 20 6f 72 20 53 51 4c 49 54 45 5f 49 47 4e  o) or SQLITE_IGN
1760: 4f 52 45 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  ORE or SQLITE_DE
1770: 4e 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 44  NY.  If SQLITE_D
1780: 45 4e 59 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ENY.** is return
1790: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 72 72  ed, then the err
17a0: 6f 72 20 63 6f 75 6e 74 20 61 6e 64 20 65 72 72  or count and err
17b0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
17c0: 61 72 73 65 20 61 72 65 0a 2a 2a 20 6d 6f 64 69  arse are.** modi
17d0: 66 69 65 64 20 61 70 70 72 6f 70 72 69 61 74 65  fied appropriate
17e0: 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
17f0: 65 33 41 75 74 68 43 68 65 63 6b 28 0a 20 20 50  e3AuthCheck(.  P
1800: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
1810: 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73  int code,.  cons
1820: 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20  t char *zArg1,. 
1830: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
1840: 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g2,.  const char
1850: 20 2a 7a 41 72 67 33 0a 29 7b 0a 20 20 73 71 6c   *zArg3.){.  sql
1860: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1870: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  e->db;.  int rc;
1880: 0a 0a 20 20 2f 2a 20 44 6f 6e 27 74 20 64 6f 20  ..  /* Don't do 
1890: 61 6e 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  any authorizatio
18a0: 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20  n checks if the 
18b0: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 69 74  database is init
18c0: 69 61 6c 69 73 69 6e 67 0a 20 20 2a 2a 20 6f 72  ialising.  ** or
18d0: 20 69 66 20 74 68 65 20 70 61 72 73 65 72 20 69   if the parser i
18e0: 73 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20  s being invoked 
18f0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 73 71 6c 69  from within sqli
1900: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
1910: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
1920: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 49 4e  >init.busy || IN
1930: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
1940: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1950: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
1960: 28 20 64 62 2d 3e 78 41 75 74 68 3d 3d 30 20 29  ( db->xAuth==0 )
1970: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1980: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
1990: 20 3d 20 64 62 2d 3e 78 41 75 74 68 28 64 62 2d   = db->xAuth(db-
19a0: 3e 70 41 75 74 68 41 72 67 2c 20 63 6f 64 65 2c  >pAuthArg, code,
19b0: 20 7a 41 72 67 31 2c 20 7a 41 72 67 32 2c 20 7a   zArg1, zArg2, z
19c0: 41 72 67 33 2c 20 70 50 61 72 73 65 2d 3e 7a 41  Arg3, pParse->zA
19d0: 75 74 68 43 6f 6e 74 65 78 74 29 3b 0a 20 20 69  uthContext);.  i
19e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 45  f( rc==SQLITE_DE
19f0: 4e 59 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  NY ){.    sqlite
1a00: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a10: 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65  , "not authorize
1a20: 64 22 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  d");.    pParse-
1a30: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54  >rc = SQLITE_AUT
1a40: 48 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  H;.  }else if( r
1a50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1a60: 72 63 21 3d 53 51 4c 49 54 45 5f 49 47 4e 4f 52  rc!=SQLITE_IGNOR
1a70: 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  E ){.    rc = SQ
1a80: 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 20 20 73  LITE_DENY;.    s
1a90: 71 6c 69 74 65 41 75 74 68 42 61 64 52 65 74 75  qliteAuthBadRetu
1aa0: 72 6e 43 6f 64 65 28 70 50 61 72 73 65 2c 20 72  rnCode(pParse, r
1ab0: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
1ac0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75   rc;.}../*.** Pu
1ad0: 73 68 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  sh an authorizat
1ae0: 69 6f 6e 20 63 6f 6e 74 65 78 74 2e 20 20 41 66  ion context.  Af
1af0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
1b00: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 0a   is called, the.
1b10: 2a 2a 20 7a 41 72 67 33 20 61 72 67 75 6d 65 6e  ** zArg3 argumen
1b20: 74 20 74 6f 20 61 75 74 68 6f 72 69 7a 61 74 69  t to authorizati
1b30: 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20 77 69 6c  on callbacks wil
1b40: 6c 20 62 65 20 7a 43 6f 6e 74 65 78 74 20 75 6e  l be zContext un
1b50: 74 69 6c 0a 2a 2a 20 70 6f 70 70 65 64 2e 20 20  til.** popped.  
1b60: 4f 72 20 69 66 20 70 50 61 72 73 65 3d 3d 30 2c  Or if pParse==0,
1b70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1b80: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f 69   a no-op..*/.voi
1b90: 64 20 73 71 6c 69 74 65 33 41 75 74 68 43 6f 6e  d sqlite3AuthCon
1ba0: 74 65 78 74 50 75 73 68 28 0a 20 20 50 61 72 73  textPush(.  Pars
1bb0: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 41 75 74  e *pParse,.  Aut
1bc0: 68 43 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65  hContext *pConte
1bd0: 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  xt, .  const cha
1be0: 72 20 2a 7a 43 6f 6e 74 65 78 74 0a 29 7b 0a 20  r *zContext.){. 
1bf0: 20 70 43 6f 6e 74 65 78 74 2d 3e 70 50 61 72 73   pContext->pPars
1c00: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66  e = pParse;.  if
1c10: 28 20 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20  ( pParse ){.    
1c20: 70 43 6f 6e 74 65 78 74 2d 3e 7a 41 75 74 68 43  pContext->zAuthC
1c30: 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
1c40: 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
1c50: 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
1c60: 43 6f 6e 74 65 78 74 20 3d 20 7a 43 6f 6e 74 65  Context = zConte
1c70: 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  xt;.  }.}../*.**
1c80: 20 50 6f 70 20 61 6e 20 61 75 74 68 6f 72 69 7a   Pop an authoriz
1c90: 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 74 68  ation context th
1ca0: 61 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  at was previousl
1cb0: 79 20 70 75 73 68 65 64 0a 2a 2a 20 62 79 20 73  y pushed.** by s
1cc0: 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78  qlite3AuthContex
1cd0: 74 50 75 73 68 0a 2a 2f 0a 76 6f 69 64 20 73 71  tPush.*/.void sq
1ce0: 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78 74  lite3AuthContext
1cf0: 50 6f 70 28 41 75 74 68 43 6f 6e 74 65 78 74 20  Pop(AuthContext 
1d00: 2a 70 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66  *pContext){.  if
1d10: 28 20 70 43 6f 6e 74 65 78 74 2d 3e 70 50 61 72  ( pContext->pPar
1d20: 73 65 20 29 7b 0a 20 20 20 20 70 43 6f 6e 74 65  se ){.    pConte
1d30: 78 74 2d 3e 70 50 61 72 73 65 2d 3e 7a 41 75 74  xt->pParse->zAut
1d40: 68 43 6f 6e 74 65 78 74 20 3d 20 70 43 6f 6e 74  hContext = pCont
1d50: 65 78 74 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  ext->zAuthContex
1d60: 74 3b 0a 20 20 20 20 70 43 6f 6e 74 65 78 74 2d  t;.    pContext-
1d70: 3e 70 50 61 72 73 65 20 3d 20 30 3b 0a 20 20 7d  >pParse = 0;.  }
1d80: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
1d90: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
1da0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a                 IZATION */.