Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
* Added method `GetIssues()` for result.Result to get query issues

## v3.117.1
* Fixed scan a column of type `Decimal(precision,scale)` into a struct field of type `types.Decimal{}` using `ScanStruct()`
* Fixed race in integration test `TestTopicWriterLogMessagesWithoutData`
Expand Down
11 changes: 11 additions & 0 deletions internal/query/result.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"time"

"github.com/ydb-platform/ydb-go-genproto/Ydb_Query_V1"
"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Issue"
"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Query"

"github.com/ydb-platform/ydb-go-sdk/v3/internal/query/result"
Expand All @@ -30,6 +31,7 @@ type (
materializedResult struct {
resultSets []result.Set
idx int
issues []*Ydb_Issue.IssueMessage
}
streamResult struct {
stream Ydb_Query_V1.QueryService_ExecuteQueryClient
Expand Down Expand Up @@ -66,10 +68,18 @@ func (r *materializedResult) ResultSets(ctx context.Context) xiter.Seq2[result.S
return rangeResultSets(ctx, r)
}

func (r *materializedResult) GetIssues() []*Ydb_Issue.IssueMessage {
return r.issues
}

func (r *streamResult) ResultSets(ctx context.Context) xiter.Seq2[result.Set, error] {
return rangeResultSets(ctx, r)
}

func (r *streamResult) GetIssues() []*Ydb_Issue.IssueMessage {
return r.lastPart.GetIssues()
}

func (r *materializedResult) Close(ctx context.Context) error {
return nil
}
Expand Down Expand Up @@ -457,5 +467,6 @@ func resultToMaterializedResult(ctx context.Context, r result.Result) (result.Re

return &materializedResult{
resultSets: resultSets,
issues: r.GetIssues(),
}, nil
}
4 changes: 4 additions & 0 deletions internal/query/result/result.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package result
import (
"context"

"github.com/ydb-platform/ydb-go-genproto/protos/Ydb_Issue"

"github.com/ydb-platform/ydb-go-sdk/v3/internal/closer"
"github.com/ydb-platform/ydb-go-sdk/v3/internal/query/scanner"
"github.com/ydb-platform/ydb-go-sdk/v3/internal/value"
Expand All @@ -20,6 +22,8 @@ type (
// ResultSets is experimental API for range iterators available
// with Go version 1.23+
ResultSets(ctx context.Context) xiter.Seq2[Set, error]
// GetIssues returns warning messages collected during the query execution
GetIssues() []*Ydb_Issue.IssueMessage
}
Set interface {
Index() int
Expand Down
54 changes: 54 additions & 0 deletions tests/integration/query_execute_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -771,3 +771,57 @@ func TestIssue1785FillDecimalFields(t *testing.T) {
require.EqualValues(t, expectedVal, rd.DecimalVal)
})
}

func TestIssue1872QueryWarning(t *testing.T) {
ctx, cancel := context.WithCancel(xtest.Context(t))
defer cancel()
db, err := ydb.Open(ctx,
os.Getenv("YDB_CONNECTION_STRING"),
ydb.WithAccessTokenCredentials(os.Getenv("YDB_ACCESS_TOKEN_CREDENTIALS")),
ydb.WithTraceQuery(
log.Query(
log.Default(os.Stdout,
log.WithLogQuery(),
log.WithColoring(),
log.WithMinLevel(log.INFO),
),
trace.QueryEvents,
),
),
)
require.NoError(t, err)
_ = db.Query().Exec(ctx,
`drop table TestIssue1872QueryWarning;`,
)
err = db.Query().Exec(ctx,
`create table TestIssue1872QueryWarning
(Id uint64, Amount decimal(22,9), primary key(Id));`,
)
require.NoError(t, err)

t.Run("Query", func(t *testing.T) {
q := db.Query()
result, err := q.Query(ctx, `
insert into TestIssue1872QueryWarning (Id, Amount) values (-3, Decimal("3.01",22,9));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Simpler SQL query without table creation, and with issues:

DECLARE $x as String; SELECT 42;

Copy link
Contributor Author

@xelavopelk xelavopelk Oct 17, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

insert to table is leaved as the second issue case

insert into TestIssue1872QueryWarning (Id, Amount) values (-5, Decimal("5.01",22,9));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues is returned when several ResultSets , for example:

DECLARE $x as String;
SELECT 42;
SELECT 43;

It is a bug in the code

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

`,
query.WithParameters(
ydb.ParamsBuilder().
Param("$p1").Text("test").
Build(),
),
query.WithSyntax(query.SyntaxYQL),
query.WithIdempotent(),
)
require.NoError(t, err)
issues := result.GetIssues()
require.Equal(t, 1, len(issues))
require.Equal(t, "Type annotation", issues[0].Message)
require.Equal(t, 2, len(issues[0].Issues))
require.Equal(t, "At function: KiWriteTable!", issues[0].Issues[0].Message)
require.Equal(t,
"Failed to convert type: Struct<'Amount':Decimal(22,9),'Id':Int32> to Struct<'Amount':Decimal(22,9)?,'Id':Uint64?>",
issues[0].Issues[0].Issues[0].Message)
fmt.Printf("%#v", result)
})
}
Loading