|
30 | 30 | _ functionClass = &databaseFunctionClass{} |
31 | 31 | _ functionClass = &foundRowsFunctionClass{} |
32 | 32 | _ functionClass = ¤tUserFunctionClass{} |
| 33 | + _ functionClass = ¤tRoleFunctionClass{} |
33 | 34 | _ functionClass = &userFunctionClass{} |
34 | 35 | _ functionClass = &connectionIDFunctionClass{} |
35 | 36 | _ functionClass = &lastInsertIDFunctionClass{} |
@@ -156,6 +157,50 @@ func (b *builtinCurrentUserSig) evalString(row chunk.Row) (string, bool, error) |
156 | 157 | return data.User.AuthIdentityString(), false, nil |
157 | 158 | } |
158 | 159 |
|
| 160 | +type currentRoleFunctionClass struct { |
| 161 | + baseFunctionClass |
| 162 | +} |
| 163 | + |
| 164 | +func (c *currentRoleFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (builtinFunc, error) { |
| 165 | + if err := c.verifyArgs(args); err != nil { |
| 166 | + return nil, err |
| 167 | + } |
| 168 | + bf := newBaseBuiltinFuncWithTp(ctx, args, types.ETString) |
| 169 | + bf.tp.Flen = 64 |
| 170 | + sig := &builtinCurrentRoleSig{bf} |
| 171 | + return sig, nil |
| 172 | +} |
| 173 | + |
| 174 | +type builtinCurrentRoleSig struct { |
| 175 | + baseBuiltinFunc |
| 176 | +} |
| 177 | + |
| 178 | +func (b *builtinCurrentRoleSig) Clone() builtinFunc { |
| 179 | + newSig := &builtinCurrentRoleSig{} |
| 180 | + newSig.cloneFrom(&b.baseBuiltinFunc) |
| 181 | + return newSig |
| 182 | +} |
| 183 | + |
| 184 | +// evalString evals a builtinCurrentUserSig. |
| 185 | +// See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_current-user |
| 186 | +func (b *builtinCurrentRoleSig) evalString(row chunk.Row) (string, bool, error) { |
| 187 | + data := b.ctx.GetSessionVars() |
| 188 | + if data == nil || data.ActiveRoles == nil { |
| 189 | + return "", true, errors.Errorf("Missing session variable when eval builtin") |
| 190 | + } |
| 191 | + if len(data.ActiveRoles) == 0 { |
| 192 | + return "", false, nil |
| 193 | + } |
| 194 | + res := "" |
| 195 | + for i, r := range data.ActiveRoles { |
| 196 | + res += r.String() |
| 197 | + if i != len(data.ActiveRoles)-1 { |
| 198 | + res += "," |
| 199 | + } |
| 200 | + } |
| 201 | + return res, false, nil |
| 202 | +} |
| 203 | + |
159 | 204 | type userFunctionClass struct { |
160 | 205 | baseFunctionClass |
161 | 206 | } |
|
0 commit comments