diff --git a/pgconn/pgconn.go b/pgconn/pgconn.go index 7426add9..bb4d35a9 100644 --- a/pgconn/pgconn.go +++ b/pgconn/pgconn.go @@ -1871,6 +1871,11 @@ func (p *Pipeline) getResultsPrepare() (*StatementDescription, error) { copy(psd.Fields, msg.Fields) return psd, nil + // NoData is returned instead of RowDescription when there is no expected result. e.g. An INSERT without a RETURNING + // clause. + case *pgproto3.NoData: + return psd, nil + // These should never happen here. But don't take chances that could lead to a deadlock. case *pgproto3.ErrorResponse: pgErr := ErrorResponseToPgError(msg) diff --git a/pgconn/pgconn_test.go b/pgconn/pgconn_test.go index 0fba9417..598d6629 100644 --- a/pgconn/pgconn_test.go +++ b/pgconn/pgconn_test.go @@ -2102,10 +2102,15 @@ func TestPipelinePrepare(t *testing.T) { require.NoError(t, err) defer closeConn(t, pgConn) + result := pgConn.ExecParams(context.Background(), `create temporary table t (id text primary key)`, nil, nil, nil, nil).Read() + require.NoError(t, result.Err) + pipeline := pgConn.StartPipeline(context.Background()) pipeline.SendPrepare("selectInt", "select $1::bigint as a", nil) pipeline.SendPrepare("selectText", "select $1::text as b", nil) pipeline.SendPrepare("selectNoParams", "select 42 as c", nil) + pipeline.SendPrepare("insertNoResults", "insert into t (id) values ($1)", nil) + pipeline.SendPrepare("insertNoParamsOrResults", "insert into t (id) values ('foo')", nil) err = pipeline.Sync() require.NoError(t, err) @@ -2133,6 +2138,20 @@ func TestPipelinePrepare(t *testing.T) { require.Equal(t, string(sd.Fields[0].Name), "c") require.Equal(t, []uint32{}, sd.ParamOIDs) + results, err = pipeline.GetResults() + require.NoError(t, err) + sd, ok = results.(*pgconn.StatementDescription) + require.Truef(t, ok, "expected StatementDescription, got: %#v", results) + require.Len(t, sd.Fields, 0) + require.Equal(t, []uint32{pgtype.TextOID}, sd.ParamOIDs) + + results, err = pipeline.GetResults() + require.NoError(t, err) + sd, ok = results.(*pgconn.StatementDescription) + require.Truef(t, ok, "expected StatementDescription, got: %#v", results) + require.Len(t, sd.Fields, 0) + require.Len(t, sd.ParamOIDs, 0) + results, err = pipeline.GetResults() require.NoError(t, err) _, ok = results.(*pgconn.PipelineSync)