temporalio / temporalio/temporal
Visibility list API filters fail on postgres when a string value contains a question mark
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 23.2k
- Forks
- 1.9k
- Avg merge
- 2d 8h
- Merged PRs (30d)
- 228
Description
Expected Behavior
The list filter docs and visibility docs don't allude to any restrictions over what sorts of values are permitted in string filters, so my general expectation is I can throw anything at it.
For example, I should be able to do Keyword = 'foo-value' as well as Keyword = 'foo?-value'
Actual Behavior
When a filter string contains a question mark, the a context cancellation error is indicated on the client side, and the following error is logged by temporal:
{
"level": "error",
"ts": "2026-08-26T13:37:04.585Z",
"msg": "service failures",
"operation": "ListWorkflowExecutions",
"wf-namespace": "default",
"grpc_code": "Unavailable",
"error": "ListWorkflowExecutions operation failed.: pq: could not determine data type of parameter $2",
"logging-call-at": "/home/runner/work/temporal/temporal/common/rpc/interceptor/request_error_handler.go:96",
"stacktrace": "go.temporal.io/server/common/log.(*zapLogger).Error\n\t/home/runner/work/temporal/temporal/common/log/zap_logger.go:158\ngo.temporal.io/server/common/rpc/interceptor.(*RequestErrorHandler).logError\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/request_error_handler.go:96\ngo.temporal.io/server/common/rpc/interceptor.(*RequestErrorHandler).HandleError\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/request_error_handler.go:72\ngo.temporal.io/server/common/rpc/interceptor.(*TelemetryInterceptor).UnaryIntercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/telemetry.go:194\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*Redirection).handleRedirectAPIInvocation.func2\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/redirection.go:272\ngo.temporal.io/server/common/rpc/interceptor.(*NoopRedirectionPolicy).WithNamespaceRedirect\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/dc_redirection_policy.go:112\ngo.temporal.io/server/common/rpc/interceptor.(*Redirection).handleRedirectAPIInvocation\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/redirection.go:269\ngo.temporal.io/server/common/rpc/interceptor.(*Redirection).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/redirection.go:229\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*NamespaceHandoverInterceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/namespace_handover.go:106\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/authorization.(*Interceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/authorization/interceptor.go:184\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/service/frontend.GrpcServerOptionsProvider.NewServerMetricsContextInjectorInterceptor.func2\n\t/home/runner/work/temporal/temporal/common/metrics/grpc.go:41\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*NamespaceLogInterceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/namespace_logger.go:60\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*NamespaceValidatorInterceptor).NamespaceValidateIntercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/namespace_validator.go:121\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*BusinessIDInterceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/business_id_interceptor.go:184\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/service/frontend.GrpcServerOptionsProvider.NewFrontendServiceErrorInterceptor.func1\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/frontend_service_error.go:35\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.ServiceErrorInterceptor\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/service_error_interceptor.go:19\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*MaskInternalErrorDetailsInterceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/mask_internal_error.go:51\ngoogle.golang.org/grpc.NewServer.chainUnaryServerInterceptors.chainUnaryInterceptors.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1233\ngo.temporal.io/api/workflowservice/v1._WorkflowService_ListWorkflowExecutions_Handler\n\t/home/runner/go/pkg/mod/go.temporal.io/api@v1.62.8/workflowservice/v1/service_grpc.pb.go:3455\ngoogle.golang.org/grpc.(*Server).processUnaryRPC\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1429\ngoogle.golang.org/grpc.(*Server).handleStream\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1855\ngoogle.golang.org/grpc.(*Server).serveStreams.func2.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1064"
}
Steps to Reproduce the Problem
- clone the samples-server repo
$ git clone https://github.com/temporalio/samples-server.git
Cloning into 'samples-server'...
remote: Enumerating objects: 1029, done.
remote: Counting objects: 100% (252/252), done.
remote: Compressing objects: 100% (121/121), done.
remote: Total 1029 (delta 182), reused 133 (delta 131), pack-reused 777 (from 2)
Receiving objects: 100% (1029/1029), 999.79 KiB | 3.16 MiB/s, done.
Resolving deltas: 100% (522/522), done.
- head to the compose dir
$ cd samples-server/compose
- start containers using the postgres example (env overrides in place to use the latest versions)
$ POSTGRESQL_VERSION=16 TEMPORAL_ADMINTOOLS_VERSION=1.31.2 TEMPORAL_VERSION=1.31.2 TEMPORAL_UI_VERSION=2.53.3 docker compose -f docker-compose-postgres.yml up -d
[+] Running 5/5
⠿ Container temporal-ui Started 12.8s
⠿ Container temporal-postgresql Healthy 5.7s
⠿ Container temporal-admin-tools Exited 1.1s
⠿ Container temporal Healthy 5.7s
⠿ Container temporal-create-namespace Started
- check everything is healthy
$ docker compose -f docker-compose-postgres.yml run --no-deps --env "TEMPORAL_ADDRESS=temporal:7233" temporal-admin-tools -c "temporal operator cluster health"
SERVING
- register a search attribute keyword
$ docker compose -f docker-compose-postgres.yml run --no-deps --env "TEMPORAL_ADDRESS=temporal:7233" temporal-admin-tools -c "temporal operator search-attribute create --name CustomKeyword --type Keyword"
Search attributes have been added
- query the keyword with a working value
$ docker compose -f docker-compose-postgres.yml run --no-deps --env "TEMPORAL_ADDRESS=temporal:7233" temporal-admin-tools -c "temporal workflow list --query \"CustomKeyword = 'foo-value'\"" 0.0s
$ echo $?
0
- query the value with a non-working value
$ docker compose -f docker-compose-postgres.yml run --no-deps --env "TEMPORAL_ADDRESS=temporal:7233" temporal-admin-tools -c "temporal workflow list --query \"CustomKeyword = 'foo?-value'\""
Error: failed listing workflows: context deadline exceeded
$ echo $?
1
- check the logs
$ docker compose -f docker-compose-postgres.yml logs temporal --tail=1
temporal | {"level":"error","ts":"2026-08-26T13:37:04.585Z","msg":"service failures","operation":"ListWorkflowExecutions","wf-namespace":"default","grpc_code":"Unavailable","error":"ListWorkflowExecutions operation failed.: pq: could not determine data type of parameter $2","logging-call-at":"/home/runner/work/temporal/temporal/common/rpc/interceptor/request_error_handler.go:96","stacktrace":"go.temporal.io/server/common/log.(*zapLogger).Error\n\t/home/runner/work/temporal/temporal/common/log/zap_logger.go:158\ngo.temporal.io/server/common/rpc/interceptor.(*RequestErrorHandler).logError\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/request_error_handler.go:96\ngo.temporal.io/server/common/rpc/interceptor.(*RequestErrorHandler).HandleError\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/request_error_handler.go:72\ngo.temporal.io/server/common/rpc/interceptor.(*TelemetryInterceptor).UnaryIntercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/telemetry.go:194\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*Redirection).handleRedirectAPIInvocation.func2\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/redirection.go:272\ngo.temporal.io/server/common/rpc/interceptor.(*NoopRedirectionPolicy).WithNamespaceRedirect\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/dc_redirection_policy.go:112\ngo.temporal.io/server/common/rpc/interceptor.(*Redirection).handleRedirectAPIInvocation\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/redirection.go:269\ngo.temporal.io/server/common/rpc/interceptor.(*Redirection).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/redirection.go:229\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*NamespaceHandoverInterceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/namespace_handover.go:106\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/authorization.(*Interceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/authorization/interceptor.go:184\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/service/frontend.GrpcServerOptionsProvider.NewServerMetricsContextInjectorInterceptor.func2\n\t/home/runner/work/temporal/temporal/common/metrics/grpc.go:41\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*NamespaceLogInterceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/namespace_logger.go:60\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*NamespaceValidatorInterceptor).NamespaceValidateIntercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/namespace_validator.go:121\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*BusinessIDInterceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/business_id_interceptor.go:184\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/service/frontend.GrpcServerOptionsProvider.NewFrontendServiceErrorInterceptor.func1\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/frontend_service_error.go:35\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.ServiceErrorInterceptor\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/service_error_interceptor.go:19\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*MaskInternalErrorDetailsInterceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/mask_internal_error.go:51\ngoogle.golang.org/grpc.NewServer.chainUnaryServerInterceptors.chainUnaryInterceptors.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1233\ngo.temporal.io/api/workflowservice/v1._WorkflowService_ListWorkflowExecutions_Handler\n\t/home/runner/go/pkg/mod/go.temporal.io/api@v1.62.8/workflowservice/v1/service_grpc.pb.go:3455\ngoogle.golang.org/grpc.(*Server).processUnaryRPC\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1429\ngoogle.golang.org/grpc.(*Server).handleStream\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1855\ngoogle.golang.org/grpc.(*Server).serveStreams.func2.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1064"}
This also reproduces through the Go SDK
package main
import (
"context"
"fmt"
"log"
"go.temporal.io/api/workflowservice/v1"
"go.temporal.io/sdk/client"
)
func main() {
ctx := context.Background()
c, err := client.Dial(client.Options{
HostPort: "localhost:7233",
Namespace: "default",
})
if err != nil {
log.Fatalf("failed to dial temporal: %v", err)
}
defer c.Close()
fmt.Println("running ok query")
_, err = c.ListWorkflow(ctx, &workflowservice.ListWorkflowExecutionsRequest{
Query: "CustomKeyword = 'foo-value'",
})
if err != nil {
log.Fatalf("failed to list workflows: %v", err)
}
fmt.Println("ok")
fmt.Println()
fmt.Println("running not-ok query")
_, err = c.ListWorkflow(ctx, &workflowservice.ListWorkflowExecutionsRequest{
Query: "CustomKeyword = 'foo?-value'",
})
if err != nil {
log.Fatalf("failed to list workflows: %v", err)
}
fmt.Println("unexpectedly ok")
}
$ go run .
running ok query
ok
running not-ok query
2026/08/26 14:46:13 failed to list workflows: context deadline exceeded
exit status 1
$ docker compose -f docker-compose-postgres.yml logs temporal --tail=1
temporal | {"level":"error","ts":"2026-08-26T13:46:09.857Z","msg":"service failures","operation":"ListWorkflowExecutions","wf-namespace":"default","grpc_code":"Unavailable","error":"ListWorkflowExecutions operation failed.: pq: could not determine data type of parameter $2","logging-call-at":"/home/runner/work/temporal/temporal/common/rpc/interceptor/request_error_handler.go:96","stacktrace":"go.temporal.io/server/common/log.(*zapLogger).Error\n\t/home/runner/work/temporal/temporal/common/log/zap_logger.go:158\ngo.temporal.io/server/common/rpc/interceptor.(*RequestErrorHandler).logError\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/request_error_handler.go:96\ngo.temporal.io/server/common/rpc/interceptor.(*RequestErrorHandler).HandleError\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/request_error_handler.go:72\ngo.temporal.io/server/common/rpc/interceptor.(*TelemetryInterceptor).UnaryIntercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/telemetry.go:194\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*Redirection).handleRedirectAPIInvocation.func2\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/redirection.go:272\ngo.temporal.io/server/common/rpc/interceptor.(*NoopRedirectionPolicy).WithNamespaceRedirect\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/dc_redirection_policy.go:112\ngo.temporal.io/server/common/rpc/interceptor.(*Redirection).handleRedirectAPIInvocation\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/redirection.go:269\ngo.temporal.io/server/common/rpc/interceptor.(*Redirection).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/redirection.go:229\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*NamespaceHandoverInterceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/namespace_handover.go:106\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/authorization.(*Interceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/authorization/interceptor.go:184\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/service/frontend.GrpcServerOptionsProvider.NewServerMetricsContextInjectorInterceptor.func2\n\t/home/runner/work/temporal/temporal/common/metrics/grpc.go:41\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*NamespaceLogInterceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/namespace_logger.go:60\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*NamespaceValidatorInterceptor).NamespaceValidateIntercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/namespace_validator.go:121\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*BusinessIDInterceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/business_id_interceptor.go:184\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/service/frontend.GrpcServerOptionsProvider.NewFrontendServiceErrorInterceptor.func1\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/frontend_service_error.go:35\ngoogle.golang.org/grpc.getChainUnaryHandler.func1.getChainUnaryHandler.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.ServiceErrorInterceptor\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/service_error_interceptor.go:19\ngoogle.golang.org/grpc.getChainUnaryHandler.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1242\ngo.temporal.io/server/common/rpc/interceptor.(*MaskInternalErrorDetailsInterceptor).Intercept\n\t/home/runner/work/temporal/temporal/common/rpc/interceptor/mask_internal_error.go:51\ngoogle.golang.org/grpc.NewServer.chainUnaryServerInterceptors.chainUnaryInterceptors.func1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1233\ngo.temporal.io/api/workflowservice/v1._WorkflowService_ListWorkflowExecutions_Handler\n\t/home/runner/go/pkg/mod/go.temporal.io/api@v1.62.8/workflowservice/v1/service_grpc.pb.go:3455\ngoogle.golang.org/grpc.(*Server).processUnaryRPC\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1429\ngoogle.golang.org/grpc.(*Server).handleStream\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1855\ngoogle.golang.org/grpc.(*Server).serveStreams.func2.1\n\t/home/runner/go/pkg/mod/google.golang.org/grpc@v1.79.3/server.go:1064"}
Specifications
- Version: 1.31.2
- Platform: (using the official docker images)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in samples-server/compose with docker-compose-postgres.yml and reproduce the failing ListWorkflowExecutions query using a value containing '?'. Trace the request into the PostgreSQL visibility query and inspect the error path referenced at common/rpc/interceptor/request_error_handler.go:96. Done means the same keyword filter succeeds with both 'foo-value' and 'foo?-value' instead of timing out.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- docker, go, postgresql
- Domain
- api, backend, databases
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100