From 5d01add7da5139f898014515b9a11ac2543ef13a Mon Sep 17 00:00:00 2001 From: idafurjes <36131195+idafurjes@users.noreply.github.com> Date: Tue, 13 Jul 2021 09:36:24 +0200 Subject: [PATCH] Fix Postgres query handling null values for smallint (#36648) * Fix Postgres query handling null values for smallint * Fix converting to int16 --- pkg/tsdb/postgres/postgres.go | 20 ++++++++++++++++++++ pkg/tsdb/postgres/postgres_test.go | 13 ++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/pkg/tsdb/postgres/postgres.go b/pkg/tsdb/postgres/postgres.go index a13f3fe0b11..6d0e229ec84 100644 --- a/pkg/tsdb/postgres/postgres.go +++ b/pkg/tsdb/postgres/postgres.go @@ -200,5 +200,25 @@ func (t *postgresQueryResultTransformer) GetConverterList() []sqlutil.StringConv }, }, }, + { + Name: "handle INT2", + InputScanKind: reflect.Interface, + InputTypeName: "INT2", + ConversionFunc: func(in *string) (*string, error) { return in, nil }, + Replacer: &sqlutil.StringFieldReplacer{ + OutputFieldType: data.FieldTypeNullableInt16, + ReplaceFunc: func(in *string) (interface{}, error) { + if in == nil { + return nil, nil + } + i64, err := strconv.ParseInt(*in, 10, 16) + if err != nil { + return nil, err + } + v := int16(i64) + return &v, nil + }, + }, + }, } } diff --git a/pkg/tsdb/postgres/postgres_test.go b/pkg/tsdb/postgres/postgres_test.go index 7d9ca7e739e..9ccaee5325a 100644 --- a/pkg/tsdb/postgres/postgres_test.go +++ b/pkg/tsdb/postgres/postgres_test.go @@ -143,7 +143,7 @@ func TestGenerateConnectionString(t *testing.T) { } // To run this test, set runPostgresTests=true -// Or from the commandline: GRAFANA_TEST_DB=postgres go test -v ./pkg/tsdb/postgres +// Or from the commandline: GRAFANA_TEST_DB=postgres go test -tags=integration -v ./pkg/tsdb/postgres // The tests require a PostgreSQL db named grafanadstest and a user/password grafanatest/grafanatest! // Use the docker/blocks/postgres_tests/docker-compose.yaml to spin up a // preconfigured Postgres server suitable for running these tests. @@ -214,7 +214,8 @@ func TestPostgres(t *testing.T) { c13_time time without time zone, c14_timetz time with time zone, time date, - c15_interval interval + c15_interval interval, + c16_smallint smallint ); ` _, err := sess.Exec(sql) @@ -226,7 +227,8 @@ func TestPostgres(t *testing.T) { 4.5,6.7,1.1,1.2, 'char10','varchar10','text', - now(),now(),now(),now(),now(),now(),'15m'::interval + now(),now(),now(),now(),now(),now(),'15m'::interval, + null ); ` _, err = sess.Exec(sql) @@ -252,9 +254,9 @@ func TestPostgres(t *testing.T) { frames, _ := queryResult.Dataframes.Decoded() require.Len(t, frames, 1) - require.Len(t, frames[0].Fields, 17) + require.Len(t, frames[0].Fields, 18) - require.Equal(t, int16(1), frames[0].Fields[0].At(0).(int16)) + require.Equal(t, int16(1), *frames[0].Fields[0].At(0).(*int16)) require.Equal(t, int32(2), *frames[0].Fields[1].At(0).(*int32)) require.Equal(t, int64(3), *frames[0].Fields[2].At(0).(*int64)) @@ -280,6 +282,7 @@ func TestPostgres(t *testing.T) { _, ok = frames[0].Fields[15].At(0).(*time.Time) require.True(t, ok) require.Equal(t, "00:15:00", *frames[0].Fields[16].At(0).(*string)) + require.Nil(t, frames[0].Fields[17].At(0)) }) })