@@ -20,6 +20,7 @@ import (
2020
2121 "github.com/dolthub/go-mysql-server/sql"
2222 "github.com/dolthub/go-mysql-server/sql/analyzer"
23+ "github.com/dolthub/go-mysql-server/sql/mysql_db"
2324)
2425
2526// ErrEventSchedulerDisabled is returned when user tries to set `event_scheduler_notifier` global system variable to ON or OFF
@@ -41,6 +42,10 @@ const (
4142 SchedulerDisabled SchedulerStatus = "DISABLED"
4243)
4344
45+ // eventSchedulerSuperUserName is the name of the locked superuser that the event scheduler
46+ // creates and uses to ensure it has access to read events from all databases.
47+ const eventSchedulerSuperUserName = "event_scheduler"
48+
4449var _ sql.EventScheduler = (* EventScheduler )(nil )
4550
4651// EventScheduler is responsible for SQL events execution.
@@ -69,10 +74,20 @@ func InitEventScheduler(
6974 ctxGetterFunc : getSqlCtxFunc ,
7075 }
7176
77+ // Ensure the event_scheduler superuser exists so that the event scheduler can read
78+ // events from all databases.
79+ initializeEventSchedulerSuperUser (a .Catalog .MySQLDb )
80+
7281 // If the EventSchedulerStatus is ON, then load enabled
7382 // events and start executing events on schedule.
7483 if es .status == SchedulerOn {
7584 ctx , commit , err := getSqlCtxFunc ()
85+ ctx .Session .SetClient (sql.Client {
86+ User : eventSchedulerSuperUserName ,
87+ Address : "localhost" ,
88+ Capabilities : 0 ,
89+ })
90+
7691 if err != nil {
7792 return nil , err
7893 }
@@ -89,6 +104,25 @@ func InitEventScheduler(
89104 return es , nil
90105}
91106
107+ // initializeEventSchedulerSuperUser ensures the event_scheduler superuser exists (as a locked
108+ // account that cannot be directly used to log in) so that the event scheduler can read events
109+ // from all databases.
110+ func initializeEventSchedulerSuperUser (mySQLDb * mysql_db.MySQLDb ) {
111+ // TODO: Creating a superuser for the event_scheduler causes the mysqldb to be marked as
112+ // enabled, which enables privileges checking for all resources. We want privileges
113+ // enabled only when running in a sql-server context, but currently creating any
114+ // engine starts up the event system, so we reset the mysqldb enabled status after
115+ // we create the event scheduler super user. To clean this up, we can look into
116+ // moving the event system initialization, or possibly just switch to enabling the
117+ // privilege system as part of server startup.
118+ wasEnabled := mySQLDb .Enabled ()
119+ defer mySQLDb .SetEnabled (wasEnabled )
120+
121+ ed := mySQLDb .Editor ()
122+ defer ed .Close ()
123+ mySQLDb .AddLockedSuperUser (ed , eventSchedulerSuperUserName , "localhost" , "" )
124+ }
125+
92126// Close closes the EventScheduler.
93127func (es * EventScheduler ) Close () {
94128 if es == nil {
0 commit comments