Azure / Azure/data-api-builder

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

Đang mở
#2,152 2 bình luận 0 reaction 0 người được giao Xem trên GitHub
bug graphql triage
Ngôn ngữ chính
C#
Star
1.5k
Fork
370
Merge trung bình
3 ngày 22 giờ
Pull request đã merge (30 ngày)
9

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Bắt đầu với SQL được tạo trong log, đặc biệt là bộ định danh cơ sở dữ liệu trống trong truy vấn con quan hệ. Theo dõi cách bộ lọc quan hệ GraphQL đi qua SqlQueryEngine.ExecuteAsync và QueryExecutor.cs. Được xem là hoàn tất khi cùng một bộ lọc thực thi thành công trên MySQL mà không tạo ra tên cơ sở dữ liệu trống.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
graphql, mysql
Lĩnh vực
api, databases
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.