System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact d197e6ac5d0b2b522d0a21a7d7665e06ad50f7cf:


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 31 34 20 32 30 30 36 2f 30 31 2f 31  v 1.14 2006/01/1
02a0: 32 20 32 30 3a 35 34 3a 30 37 20 72 6d 73 69 6d  2 20:54:07 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 66 6f 72 28 69 53 72  hema);.  for(iSr
1130: 63 3d 30 3b 20 70 54 61 62 4c 69 73 74 20 26 26  c=0; pTabList &&
1140: 20 69 53 72 63 3c 70 54 61 62 4c 69 73 74 2d 3e   iSrc<pTabList->
1150: 6e 53 72 63 3b 20 69 53 72 63 2b 2b 29 7b 0a 20  nSrc; iSrc++){. 
1160: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
1170: 61 62 6c 65 3d 3d 70 54 61 62 4c 69 73 74 2d 3e  able==pTabList->
1180: 61 5b 69 53 72 63 5d 2e 69 43 75 72 73 6f 72 20  a[iSrc].iCursor 
1190: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
11a0: 66 28 20 69 53 72 63 3e 3d 30 20 26 26 20 70 54  f( iSrc>=0 && pT
11b0: 61 62 4c 69 73 74 20 26 26 20 69 53 72 63 3c 70  abList && iSrc<p
11c0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
11d0: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
11e0: 4c 69 73 74 2d 3e 61 5b 69 53 72 63 5d 2e 70 54  List->a[iSrc].pT
11f0: 61 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ab;.  }else if( 
1200: 28 70 53 74 61 63 6b 20 3d 20 70 50 61 72 73 65  (pStack = pParse
1210: 2d 3e 74 72 69 67 53 74 61 63 6b 29 21 3d 30 20  ->trigStack)!=0 
1220: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6d  ){.    /* This m
1230: 75 73 74 20 62 65 20 61 6e 20 61 74 74 65 6d 70  ust be an attemp
1240: 74 20 74 6f 20 72 65 61 64 20 74 68 65 20 4e 45  t to read the NE
1250: 57 20 6f 72 20 4f 4c 44 20 70 73 65 75 64 6f 2d  W or OLD pseudo-
1260: 74 61 62 6c 65 73 0a 20 20 20 20 2a 2a 20 6f 66  tables.    ** of
1270: 20 61 20 74 72 69 67 67 65 72 2e 0a 20 20 20 20   a trigger..    
1280: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1290: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
12a0: 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 7c 7c 20  tack->newIdx || 
12b0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
12c0: 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 29 3b  Stack->oldIdx );
12d0: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 53 74 61  .    pTab = pSta
12e0: 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 7d 65 6c 73  ck->pTab;.  }els
12f0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  e{.    return;. 
1300: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30   }.  if( pTab==0
1310: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1320: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
1330: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1340: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
1350: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
1360: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
1370: 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
1380: 75 6d 6e 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65  umn].zName;.  }e
1390: 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 69 50  lse if( pTab->iP
13a0: 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  Key>=0 ){.    as
13b0: 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65  sert( pTab->iPKe
13c0: 79 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  y<pTab->nCol );.
13d0: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
13e0: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
13f0: 79 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  y].zName;.  }els
1400: 65 7b 0a 20 20 20 20 7a 43 6f 6c 20 3d 20 22 52  e{.    zCol = "R
1410: 4f 57 49 44 22 3b 0a 20 20 7d 0a 20 20 61 73 73  OWID";.  }.  ass
1420: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
1430: 20 29 3b 0a 20 20 7a 44 42 61 73 65 20 3d 20 64   );.  zDBase = d
1440: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1450: 65 3b 0a 20 20 72 63 20 3d 20 64 62 2d 3e 78 41  e;.  rc = db->xA
1460: 75 74 68 28 64 62 2d 3e 70 41 75 74 68 41 72 67  uth(db->pAuthArg
1470: 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 70  , SQLITE_READ, p
1480: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
1490: 2c 20 7a 44 42 61 73 65 2c 20 0a 20 20 20 20 20  , zDBase, .     
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
14b0: 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
14c0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
14d0: 49 54 45 5f 49 47 4e 4f 52 45 20 29 7b 0a 20 20  ITE_IGNORE ){.  
14e0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
14f0: 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69  _NULL;.  }else i
1500: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 45  f( rc==SQLITE_DE
1510: 4e 59 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  NY ){.    if( db
1520: 2d 3e 6e 44 62 3e 32 20 7c 7c 20 69 44 62 21 3d  ->nDb>2 || iDb!=
1530: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1540: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1550: 65 2c 20 22 61 63 63 65 73 73 20 74 6f 20 25 73  e, "access to %s
1560: 2e 25 73 2e 25 73 20 69 73 20 70 72 6f 68 69 62  .%s.%s is prohib
1570: 69 74 65 64 22 2c 20 0a 20 20 20 20 20 20 20 20  ited", .        
1580: 20 7a 44 42 61 73 65 2c 20 70 54 61 62 2d 3e 7a   zDBase, pTab->z
1590: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
15a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
15b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15c0: 61 72 73 65 2c 20 22 61 63 63 65 73 73 20 74 6f  arse, "access to
15d0: 20 25 73 2e 25 73 20 69 73 20 70 72 6f 68 69 62   %s.%s is prohib
15e0: 69 74 65 64 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d  ited",pTab->zNam
15f0: 65 2c 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  e,zCol);.    }. 
1600: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1610: 53 51 4c 49 54 45 5f 41 55 54 48 3b 0a 20 20 7d  SQLITE_AUTH;.  }
1620: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
1630: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1640: 6c 69 74 65 41 75 74 68 42 61 64 52 65 74 75 72  liteAuthBadRetur
1650: 6e 43 6f 64 65 28 70 50 61 72 73 65 2c 20 72 63  nCode(pParse, rc
1660: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1670: 44 6f 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  Do an authorizat
1680: 69 6f 6e 20 63 68 65 63 6b 20 75 73 69 6e 67 20  ion check using 
1690: 74 68 65 20 63 6f 64 65 20 61 6e 64 20 61 72 67  the code and arg
16a0: 75 6d 65 6e 74 73 20 67 69 76 65 6e 2e 20 20 52  uments given.  R
16b0: 65 74 75 72 6e 0a 2a 2a 20 65 69 74 68 65 72 20  eturn.** either 
16c0: 53 51 4c 49 54 45 5f 4f 4b 20 28 7a 65 72 6f 29  SQLITE_OK (zero)
16d0: 20 6f 72 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   or SQLITE_IGNOR
16e0: 45 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e 59  E or SQLITE_DENY
16f0: 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 44 45 4e  .  If SQLITE_DEN
1700: 59 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  Y.** is returned
1710: 2c 20 74 68 65 6e 20 74 68 65 20 65 72 72 6f 72  , then the error
1720: 20 63 6f 75 6e 74 20 61 6e 64 20 65 72 72 6f 72   count and error
1730: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
1740: 73 65 20 61 72 65 0a 2a 2a 20 6d 6f 64 69 66 69  se are.** modifi
1750: 65 64 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  ed appropriately
1760: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1770: 41 75 74 68 43 68 65 63 6b 28 0a 20 20 50 61 72  AuthCheck(.  Par
1780: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 69 6e  se *pParse,.  in
1790: 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20  t code,.  const 
17a0: 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63  char *zArg1,.  c
17b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
17c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
17d0: 7a 41 72 67 33 0a 29 7b 0a 20 20 73 71 6c 69 74  zArg3.){.  sqlit
17e0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
17f0: 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  >db;.  int rc;..
1800: 20 20 2f 2a 20 44 6f 6e 27 74 20 64 6f 20 61 6e    /* Don't do an
1810: 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  y authorization 
1820: 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 64 61  checks if the da
1830: 74 61 62 61 73 65 20 69 73 20 69 6e 69 74 69 61  tabase is initia
1840: 6c 69 73 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  lising. */.  if(
1850: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
1860: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1870: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
1880: 66 28 20 64 62 2d 3e 78 41 75 74 68 3d 3d 30 20  f( db->xAuth==0 
1890: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
18b0: 63 20 3d 20 64 62 2d 3e 78 41 75 74 68 28 64 62  c = db->xAuth(db
18c0: 2d 3e 70 41 75 74 68 41 72 67 2c 20 63 6f 64 65  ->pAuthArg, code
18d0: 2c 20 7a 41 72 67 31 2c 20 7a 41 72 67 32 2c 20  , zArg1, zArg2, 
18e0: 7a 41 72 67 33 2c 20 70 50 61 72 73 65 2d 3e 7a  zArg3, pParse->z
18f0: 41 75 74 68 43 6f 6e 74 65 78 74 29 3b 0a 20 20  AuthContext);.  
1900: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1910: 45 4e 59 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ENY ){.    sqlit
1920: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1930: 65 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a  e, "not authoriz
1940: 65 64 22 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ed");.    pParse
1950: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55  ->rc = SQLITE_AU
1960: 54 48 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  TH;.  }else if( 
1970: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1980: 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 47 4e 4f   rc!=SQLITE_IGNO
1990: 52 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RE ){.    rc = S
19a0: 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 20 20  QLITE_DENY;.    
19b0: 73 71 6c 69 74 65 41 75 74 68 42 61 64 52 65 74  sqliteAuthBadRet
19c0: 75 72 6e 43 6f 64 65 28 70 50 61 72 73 65 2c 20  urnCode(pParse, 
19d0: 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
19e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
19f0: 75 73 68 20 61 6e 20 61 75 74 68 6f 72 69 7a 61  ush an authoriza
1a00: 74 69 6f 6e 20 63 6f 6e 74 65 78 74 2e 20 20 41  tion context.  A
1a10: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
1a20: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
1a30: 0a 2a 2a 20 7a 41 72 67 33 20 61 72 67 75 6d 65  .** zArg3 argume
1a40: 6e 74 20 74 6f 20 61 75 74 68 6f 72 69 7a 61 74  nt to authorizat
1a50: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20 77 69  ion callbacks wi
1a60: 6c 6c 20 62 65 20 7a 43 6f 6e 74 65 78 74 20 75  ll be zContext u
1a70: 6e 74 69 6c 0a 2a 2a 20 70 6f 70 70 65 64 2e 20  ntil.** popped. 
1a80: 20 4f 72 20 69 66 20 70 50 61 72 73 65 3d 3d 30   Or if pParse==0
1a90: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1aa0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f  s a no-op..*/.vo
1ab0: 69 64 20 73 71 6c 69 74 65 33 41 75 74 68 43 6f  id sqlite3AuthCo
1ac0: 6e 74 65 78 74 50 75 73 68 28 0a 20 20 50 61 72  ntextPush(.  Par
1ad0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 41 75  se *pParse,.  Au
1ae0: 74 68 43 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74  thContext *pCont
1af0: 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  ext, .  const ch
1b00: 61 72 20 2a 7a 43 6f 6e 74 65 78 74 0a 29 7b 0a  ar *zContext.){.
1b10: 20 20 70 43 6f 6e 74 65 78 74 2d 3e 70 50 61 72    pContext->pPar
1b20: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
1b30: 66 28 20 70 50 61 72 73 65 20 29 7b 0a 20 20 20  f( pParse ){.   
1b40: 20 70 43 6f 6e 74 65 78 74 2d 3e 7a 41 75 74 68   pContext->zAuth
1b50: 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
1b60: 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
1b70: 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
1b80: 68 43 6f 6e 74 65 78 74 20 3d 20 7a 43 6f 6e 74  hContext = zCont
1b90: 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ext;.  }.}../*.*
1ba0: 2a 20 50 6f 70 20 61 6e 20 61 75 74 68 6f 72 69  * Pop an authori
1bb0: 7a 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 74  zation context t
1bc0: 68 61 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  hat was previous
1bd0: 6c 79 20 70 75 73 68 65 64 0a 2a 2a 20 62 79 20  ly pushed.** by 
1be0: 73 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65  sqlite3AuthConte
1bf0: 78 74 50 75 73 68 0a 2a 2f 0a 76 6f 69 64 20 73  xtPush.*/.void s
1c00: 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78  qlite3AuthContex
1c10: 74 50 6f 70 28 41 75 74 68 43 6f 6e 74 65 78 74  tPop(AuthContext
1c20: 20 2a 70 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69   *pContext){.  i
1c30: 66 28 20 70 43 6f 6e 74 65 78 74 2d 3e 70 50 61  f( pContext->pPa
1c40: 72 73 65 20 29 7b 0a 20 20 20 20 70 43 6f 6e 74  rse ){.    pCont
1c50: 65 78 74 2d 3e 70 50 61 72 73 65 2d 3e 7a 41 75  ext->pParse->zAu
1c60: 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 43 6f 6e  thContext = pCon
1c70: 74 65 78 74 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  text->zAuthConte
1c80: 78 74 3b 0a 20 20 20 20 70 43 6f 6e 74 65 78 74  xt;.    pContext
1c90: 2d 3e 70 50 61 72 73 65 20 3d 20 30 3b 0a 20 20  ->pParse = 0;.  
1ca0: 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  }.}..#endif /* S
1cb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
1cc0: 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a              RIZATION */.