Commit c22940fe by Eder Nucci Committed by GitHub

MSSQL: Fix parsing of uniqueidentifier type (#25751)

Closes #17084

Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com>
parent 4422ba0f
...@@ -10,7 +10,7 @@ import ( ...@@ -10,7 +10,7 @@ import (
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util"
_ "github.com/denisenkom/go-mssqldb" mssql "github.com/denisenkom/go-mssqldb"
"github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/tsdb" "github.com/grafana/grafana/pkg/tsdb"
...@@ -130,6 +130,13 @@ func (t *mssqlQueryResultTransformer) TransformQueryResult(columnTypes []*sql.Co ...@@ -130,6 +130,13 @@ func (t *mssqlQueryResultTransformer) TransformQueryResult(columnTypes []*sql.Co
} else { } else {
t.log.Debug("Rows", "Error converting numeric to float", value) t.log.Debug("Rows", "Error converting numeric to float", value)
} }
case "UNIQUEIDENTIFIER":
uuid := &mssql.UniqueIdentifier{}
if err := uuid.Scan(value); err == nil {
values[i] = uuid.String()
} else {
t.log.Debug("Rows", "Error converting uniqueidentifier to string", value)
}
default: default:
t.log.Debug("Rows", "Unknown database type", columnTypes[i].DatabaseTypeName(), "value", value) t.log.Debug("Rows", "Unknown database type", columnTypes[i].DatabaseTypeName(), "value", value)
values[i] = string(value) values[i] = string(value)
......
...@@ -90,7 +90,9 @@ func TestMSSQL(t *testing.T) { ...@@ -90,7 +90,9 @@ func TestMSSQL(t *testing.T) {
c_smalldatetime smalldatetime, c_smalldatetime smalldatetime,
c_date date, c_date date,
c_time time, c_time time,
c_datetimeoffset datetimeoffset c_datetimeoffset datetimeoffset,
c_uuid uniqueidentifier
) )
` `
...@@ -103,6 +105,7 @@ func TestMSSQL(t *testing.T) { ...@@ -103,6 +105,7 @@ func TestMSSQL(t *testing.T) {
dt2 := time.Date(2018, 3, 14, 21, 20, 6, 8896406e2, time.UTC) dt2 := time.Date(2018, 3, 14, 21, 20, 6, 8896406e2, time.UTC)
dt2Format := "2006-01-02 15:04:05.999999999 -07:00" dt2Format := "2006-01-02 15:04:05.999999999 -07:00"
d2 := dt2.Format(dt2Format) d2 := dt2.Format(dt2Format)
uuid := "B33D42A3-AC5A-4D4C-81DD-72F3D5C49025"
sql = fmt.Sprintf(` sql = fmt.Sprintf(`
INSERT INTO [mssql_types] INSERT INTO [mssql_types]
...@@ -111,8 +114,9 @@ func TestMSSQL(t *testing.T) { ...@@ -111,8 +114,9 @@ func TestMSSQL(t *testing.T) {
1.11, 2.22, 3.33, 1.11, 2.22, 3.33,
'char10', 'varchar10', 'text', 'char10', 'varchar10', 'text',
N'☺nchar12☺', N'☺nvarchar12☺', N'☺text☺', N'☺nchar12☺', N'☺nvarchar12☺', N'☺text☺',
CAST('%s' AS DATETIME), CAST('%s' AS DATETIME2), CAST('%s' AS SMALLDATETIME), CAST('%s' AS DATE), CAST('%s' AS TIME), SWITCHOFFSET(CAST('%s' AS DATETIMEOFFSET), '-07:00') CAST('%s' AS DATETIME), CAST('%s' AS DATETIME2), CAST('%s' AS SMALLDATETIME), CAST('%s' AS DATE), CAST('%s' AS TIME), SWITCHOFFSET(CAST('%s' AS DATETIMEOFFSET), '-07:00'),
`, d, d2, d, d, d, d2) CONVERT(uniqueidentifier, '%s')
`, d, d2, d, d, d, d2, uuid)
_, err = sess.Exec(sql) _, err = sess.Exec(sql)
So(err, ShouldBeNil) So(err, ShouldBeNil)
...@@ -164,6 +168,8 @@ func TestMSSQL(t *testing.T) { ...@@ -164,6 +168,8 @@ func TestMSSQL(t *testing.T) {
So(column[20].(time.Time), ShouldEqual, dt.Truncate(24*time.Hour)) So(column[20].(time.Time), ShouldEqual, dt.Truncate(24*time.Hour))
So(column[21].(time.Time), ShouldEqual, time.Date(1, 1, 1, dt.Hour(), dt.Minute(), dt.Second(), dt.Nanosecond(), time.UTC)) So(column[21].(time.Time), ShouldEqual, time.Date(1, 1, 1, dt.Hour(), dt.Minute(), dt.Second(), dt.Nanosecond(), time.UTC))
So(column[22].(time.Time), ShouldEqual, dt2.In(time.FixedZone("UTC-7", int(-7*60*60)))) So(column[22].(time.Time), ShouldEqual, dt2.In(time.FixedZone("UTC-7", int(-7*60*60))))
So(column[23].(string), ShouldEqual, uuid)
}) })
}) })
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment