Azure / Azure/data-api-builder
[Bug]: GraphQL filtering by relation property causes `Incorrect database name ''`
- Lenguaje dominante
- C#
- Estrellas
- 1.5k
- Forks
- 370
- Merge medio
- 3 d 22 h
- PR fusionados (30 d)
- 9
Descripción
### What happened?
Running the following query
```gql
query FilterByRelation {
translations(filter: { layer: { parent_id: { isNull: true } } }) {
items {
key
value
}
}
}
```
where config is like this:
```json
"Translation": {
"source": "translations",
"relationships": {
"layer": {
"cardinality": "one",
"target.entity": "Layer"
},
```
and `layer.parent_id` is a nullable reference to `layer.id`
causes the following error to be returned:
```json
{
"errors": [
{
"message": "Incorrect database name ''",
"extensions": {
"code": "DatabaseOperationFailed"
}
}
]
}
```
### Version
Not sure. Whatever's bundled with SWA cli 1.1.7 (I'm not using the `dab` cli directly)
### What database are you using?
MySQL
### What hosting model are you using?
Local (including CLI)
### Which API approach are you accessing DAB through?
GraphQL
### Relevant log output
```Text
[1] [swa] OPTIONS http://0.0.0.0:5000/graphql/ (proxy)
[1] [dataApi] info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
[1] [dataApi] Request starting HTTP/1.1 OPTIONS http://localhost:4280/graphql/ - 0
[1] [dataApi] info: Microsoft.AspNetCore.Cors.Infrastructure.CorsService[4]
[1] [dataApi] CORS policy execution successful.
[1] [dataApi] info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
[1] [dataApi] Request finished HTTP/1.1 OPTIONS http://localhost:4280/graphql/ - 0 - 204 - - 30.7541ms
[1] [swa] OPTIONS http://localhost:4280/graphql/ - 204
[1] [swa] POST http://0.0.0.0:5000/graphql/ (proxy)
[1] [dataApi] info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
[1] [dataApi] Request starting HTTP/1.1 POST http://localhost:4280/graphql/ application/json 414
[1] [dataApi] info: Microsoft.AspNetCore.Cors.Infrastructure.CorsService[4]
[1] [dataApi] CORS policy execution successful.
[1] [dataApi] dbug: Azure.DataApiBuilder.Core.AuthenticationHelpers.ClientRoleHeaderAuthenticationMiddleware[0]
[1] [dataApi] 7abc4781-f531-42e6-9727-7953d39456aa Request authentication state: Anonymous.
[1] [dataApi] dbug: Azure.DataApiBuilder.Core.AuthenticationHelpers.ClientRoleHeaderAuthenticationMiddleware[0]
[1] [dataApi] 7abc4781-f531-42e6-9727-7953d39456aa The request will be executed in the context of the role: Anonymous
[1] [dataApi] info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
[1] [dataApi] Executing endpoint 'Hot Chocolate GraphQL Pipeline'
[1] [dataApi] dbug: Azure.DataApiBuilder.Core.Resolvers.IQueryExecutor[0]
[1] [dataApi] 7abc4781-f531-42e6-9727-7953d39456aa Executing query: SELECT COALESCE(JSON_ARRAYAGG(JSON_OBJECT(@param2, `subq4`.`key`, @param3, `subq4`.`value`)), JSON_ARRAY()) AS `data` FROM ( SELECT `table0`.`key` AS `key`, `table0`.`value` AS `value` FROM `translations` AS `table0` WHERE EXISTS (SELECT 1 FROM ``.`layers` AS `table1` WHERE `table1`.`parent_id` IS NULL AND `table0`.`layer_id` = `table1`.`id`) ORDER BY `table0`.`key` ASC, `table0`.`layer_id` ASC, `table0`.`language_id` ASC LIMIT 100 ) AS `subq4`
[1] [dataApi] fail: Azure.DataApiBuilder.Core.Resolvers.IQueryExecutor[0]
[1] [dataApi] 7abc4781-f531-42e6-9727-7953d39456aa Query execution error due to:
[1] [dataApi] Incorrect database name ''
[1] [dataApi] MySqlConnector.MySqlException (0x80004005): Incorrect database name ''
[1] [dataApi] at MySqlConnector.Core.ServerSession.ReceiveReplyAsyncAwaited(ValueTask`1 task) in /_/src/MySqlConnector/Core/ServerSession.cs:line 954
[1] [dataApi] at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in /_/src/MySqlConnector/Core/ResultSet.cs:line 43
[1] [dataApi] at MySqlConnector.MySqlDataReader.ActivateResultSet(CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlDataReader.cs:line 127
[1] [dataApi] at MySqlConnector.MySqlDataReader.CreateAsync(CommandListPosition commandListPosition, ICommandPayloadCreator payloadCreator, IDictionary`2 cachedProcedures, IMySqlCommand command, CommandBehavior behavior, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlDataReader.cs:line 456
[1] [dataApi] at MySqlConnector.Core.CommandExecutor.ExecuteReaderAsync(IReadOnlyList`1 commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/CommandExecutor.cs:line 56
[1] [dataApi] at MySqlConnector.MySqlCommand.ExecuteReaderAsync(CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlCommand.cs:line 330
[1] [dataApi] at MySqlConnector.MySqlCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlCommand.cs:line 323
[1] [dataApi] at Azure.DataApiBuilder.Core.Resolvers.QueryExecutor`1.ExecuteQueryAgainstDbAsync[TResult](TConnection conn, String sqltext, IDictionary`2 parameters, Func`3 dataReaderHandler, HttpContext httpContext, List`1 args) in /_/src/Core/Resolvers/QueryExecutor.cs:line 177
[1] [dataApi] fail: Azure.DataApiBuilder.Service.Startup[0]
[1] [dataApi] A GraphQL request execution error occurred.
[1] [dataApi] Azure.DataApiBuilder.Service.Exceptions.DataApiBuilderException: Incorrect database name ''
[1] [dataApi] ---> MySqlConnector.MySqlException (0x80004005): Incorrect database name ''
[1] [dataApi] at MySqlConnector.Core.ServerSession.ReceiveReplyAsyncAwaited(ValueTask`1 task) in /_/src/MySqlConnector/Core/ServerSession.cs:line 954
[1] [dataApi] at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in /_/src/MySqlConnector/Core/ResultSet.cs:line 43
[1] [dataApi] at MySqlConnector.MySqlDataReader.ActivateResultSet(CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlDataReader.cs:line 127
[1] [dataApi] at MySqlConnector.MySqlDataReader.CreateAsync(CommandListPosition commandListPosition, ICommandPayloadCreator payloadCreator, IDictionary`2 cachedProcedures, IMySqlCommand command, CommandBehavior behavior, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlDataReader.cs:line 456
[1] [dataApi] at MySqlConnector.Core.CommandExecutor.ExecuteReaderAsync(IReadOnlyList`1 commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/CommandExecutor.cs:line 56
[1] [dataApi] at MySqlConnector.MySqlCommand.ExecuteReaderAsync(CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlCommand.cs:line 330
[1] [dataApi] at MySqlConnector.MySqlCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlCommand.cs:line 323
[1] [dataApi] at Azure.DataApiBuilder.Core.Resolvers.QueryExecutor`1.ExecuteQueryAgainstDbAsync[TResult](TConnection conn, String sqltext, IDictionary`2 parameters, Func`3 dataReaderHandler, HttpContext httpContext, List`1 args) in /_/src/Core/Resolvers/QueryExecutor.cs:line 177
[1] [dataApi] --- End of inner exception stack trace ---
[1] [dataApi] at Azure.DataApiBuilder.Core.Resolvers.QueryExecutor`1.ExecuteQueryAgainstDbAsync[TResult](TConnection conn, String sqltext, IDictionary`2 parameters, Func`3 dataReaderHandler, HttpContext httpContext, List`1 args) in /_/src/Core/Resolvers/QueryExecutor.cs:line 195
[1] [dataApi] at Azure.DataApiBuilder.Core.Resolvers.QueryExecutor`1.<>c__DisplayClass19_0`1.<b__0>d.MoveNext() in /_/src/Core/Resolvers/QueryExecutor.cs:line 102
[1] [dataApi] --- End of stack trace from previous location ---
[1] at Polly.Retry.AsyncRetryEngine.ImplementationAsync[TResult](Func`3 action, Context context, CancellationToken cancellationToken, ExceptionPredicates shouldRetryExceptionPredicates, ResultPredicates`1 shouldRetryResultPredicates, Func`5 onRetryAsync, Int32 permittedRetryCount, IEnumerable`1 sleepDurationsEnumerable, Func`4 sleepDurationProvider, Boolean continueOnCapturedContext)
[1] [dataApi] at Polly.AsyncPolicy.ExecuteAsync[TResult](Func`3 action, Context context, CancellationToken cancellationToken, Boolean continueOnCapturedContext)
[1] [dataApi] at Azure.DataApiBuilder.Core.Resolvers.QueryExecutor`1.ExecuteQueryAsync[TResult](String sqltext, IDictionary`2 parameters, Func`3 dataReaderHandler, HttpContext httpContext, List`1 args, String dataSourceName) in /_/src/Core/Resolvers/QueryExecutor.cs:line 90
[1] [dataApi] at Azure.DataApiBuilder.Core.Resolvers.SqlQueryEngine.ExecuteAsync(SqlQueryStructure structure, String dataSourceName) in /_/src/Core/Resolvers/SqlQueryEngine.cs:line 207
[1] [dataApi] at Azure.DataApiBuilder.Core.Resolvers.SqlQueryEngine.ExecuteAsync(IMiddlewareContext context, IDictionary`2 parameters, String dataSourceName) in /_/src/Core/Resolvers/SqlQueryEngine.cs:line 75
[1] [dataApi] at Azure.DataApiBuilder.Core.Services.ResolverMiddleware.InvokeAsync(IMiddlewareContext context) in /_/src/Core/Services/ResolverMiddleware.cs:line 94
[1] [dataApi] at HotChocolate.Utilities.MiddlewareCompiler`1.ExpressionHelper.AwaitTaskHelper(Task task)
[1] [dataApi] at HotChocolate.Execution.Processing.Tasks.ResolverTask.ExecuteResolverPipelineAsync(CancellationToken cancellationToken)
[1] [dataApi] at HotChocolate.Execution.Processing.Tasks.ResolverTask.TryExecuteAsync(CancellationToken cancellationToken)
[1] [swa] POST http://localhost:4280/graphql/ - 500
[1] [dataApi] info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
[1] [dataApi] Executed endpoint 'Hot Chocolate GraphQL Pipeline'
[1] [dataApi] info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
[1] [dataApi] Request finished HTTP/1.1 POST http://localhost:4280/graphql/ application/json 414 - 500 - application/json;+charset=utf-8 626.6180ms
```
```
### Code of Conduct
- [X] I agree to follow this project's Code of Conduct
Guía de contribución
Línea de trabajo
Empieza con el SQL generado en el registro, especialmente con el calificador de base de datos vacío en la subconsulta de relación. Sigue cómo fluye el filtro de relación de GraphQL a través de SqlQueryEngine.ExecuteAsync y QueryExecutor.cs. Se considera terminado cuando el mismo filtro se ejecuta correctamente contra MySQL sin producir un nombre de base de datos vacío.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- graphql, mysql
- Área
- api, databases
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100