@@ -745,20 +745,22 @@ 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 ;
751+ * lk_count = 0 ;
751752 if (vtable == NULL || db == NULL || db -> aModule .count == 0 )
752753 return NULL ;
753754 struct Module * module ;
754- char * lockname = NULL ;
755+ const char * * locknames = NULL ;
755756 sqlite3_mutex_enter (db -> mutex );
756757 if ((module = sqlite3HashFind (& db -> aModule , vtable )) != NULL ) {
757758 * is_system_table = 1 ;
758- lockname = module -> pModule -> systable_lock ;
759+ * lk_count = module -> pModule -> systable_lock_count ;
760+ locknames = module -> pModule -> systable_locks ;
759761 }
760762 sqlite3_mutex_leave (db -> mutex );
761- return lockname ;
763+ return locknames ;
762764}
763765
764766static int vtable_search (char * * vtables , int ntables , const char * table )
@@ -773,12 +775,14 @@ static int vtable_search(char **vtables, int ntables, const char *table)
773775
774776static void record_locked_vtable (struct sql_authorizer_state * pAuthState , const char * table )
775777{
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 );
778+ int is_system_table , lk_cnt ;
779+ const char * * vtable_locks = vtable_locknames (pAuthState -> db , table , & is_system_table , & lk_cnt );
780+ for (int i = 0 ; i < lk_cnt ; i ++ ) {
781+ if (!vtable_search (pAuthState -> vTableLocks , pAuthState -> numVTableLocks , vtable_locks [i ])) {
782+ pAuthState -> vTableLocks =
783+ (char * * )realloc (pAuthState -> vTableLocks , sizeof (char * ) * (pAuthState -> numVTableLocks + 1 ));
784+ pAuthState -> vTableLocks [pAuthState -> numVTableLocks ++ ] = strdup (vtable_locks [i ]);
785+ }
782786 }
783787 if (is_system_table && !pAuthState -> hasVTables )
784788 pAuthState -> hasVTables = 1 ;
0 commit comments