@@ -745,20 +745,21 @@ void sqlinit(void)
745745 if (sqlite3_initialize ()) abort ();
746746}
747747
748- static char * vtable_lockname (sqlite3 * db , const char * vtable , int * is_system_table )
748+ static const char * * vtable_locknames (sqlite3 * db , const char * vtable , int * is_system_table , int * lk_count )
749749{
750750 * is_system_table = 0 ;
751751 if (vtable == NULL || db == NULL || db -> aModule .count == 0 )
752752 return NULL ;
753753 struct Module * module ;
754- char * lockname = NULL ;
754+ const char * * locknames = NULL ;
755755 sqlite3_mutex_enter (db -> mutex );
756756 if ((module = sqlite3HashFind (& db -> aModule , vtable )) != NULL ) {
757757 * is_system_table = 1 ;
758- lockname = module -> pModule -> systable_lock ;
758+ * lk_count = module -> pModule -> systable_lock_count ;
759+ locknames = module -> pModule -> systable_locks ;
759760 }
760761 sqlite3_mutex_leave (db -> mutex );
761- return lockname ;
762+ return locknames ;
762763}
763764
764765static int vtable_search (char * * vtables , int ntables , const char * table )
@@ -773,12 +774,14 @@ static int vtable_search(char **vtables, int ntables, const char *table)
773774
774775static void record_locked_vtable (struct sql_authorizer_state * pAuthState , const char * table )
775776{
776- int is_system_table ;
777- const char * vtable_lock = vtable_lockname (pAuthState -> db , table , & is_system_table );
778- if (vtable_lock && !vtable_search (pAuthState -> vTableLocks , pAuthState -> numVTableLocks , vtable_lock )) {
779- pAuthState -> vTableLocks =
780- (char * * )realloc (pAuthState -> vTableLocks , sizeof (char * ) * (pAuthState -> numVTableLocks + 1 ));
781- pAuthState -> vTableLocks [pAuthState -> numVTableLocks ++ ] = strdup (vtable_lock );
777+ int is_system_table , lk_cnt ;
778+ const char * * vtable_locks = vtable_locknames (pAuthState -> db , table , & is_system_table , & lk_cnt );
779+ for (int i = 0 ; i < lk_cnt ; i ++ ) {
780+ if (!vtable_search (pAuthState -> vTableLocks , pAuthState -> numVTableLocks , vtable_locks [i ])) {
781+ pAuthState -> vTableLocks =
782+ (char * * )realloc (pAuthState -> vTableLocks , sizeof (char * ) * (pAuthState -> numVTableLocks + 1 ));
783+ pAuthState -> vTableLocks [pAuthState -> numVTableLocks ++ ] = strdup (vtable_locks [i ]);
784+ }
782785 }
783786 if (is_system_table && !pAuthState -> hasVTables )
784787 pAuthState -> hasVTables = 1 ;
0 commit comments