Azure / Azure/data-api-builder

[Bug]: GraphQL filtering by relation property causes `Incorrect database name ''`

未关闭
#2,152 2 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
bug graphql triage
主要语言
C#
星标
1.5k
派生
370
平均合并
3 天 22 小时
30 天内合并 PR
9

描述

### 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

贡献指南

打开贡献指南

调研方向

从日志中的生成 SQL 开始,重点关注关系子查询中的空数据库限定符。跟踪 GraphQL 关系筛选器如何流经 SqlQueryEngine.ExecuteAsync 和 QueryExecutor.cs。完成的标准是同一筛选器能够在 MySQL 上成功执行,且不会生成空的数据库名称。

由索引模型根据 Issue 内容生成。

评估

技术栈
graphql, mysql
领域
api, databases
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。