From 7377d2834e889bfcc8441f895625733000468556 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Thu, 4 Mar 2021 17:29:33 +0100 Subject: [PATCH] tests: add TestNullableEXPLAIN Failing test for "EXPLAIN SELECT * FROM mysql.user": column Extra is indicated not nullable, but data contains NULL. --- driver_test.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/driver_test.go b/driver_test.go index 54f7cd10c..c014ea3c9 100644 --- a/driver_test.go +++ b/driver_test.go @@ -2978,6 +2978,50 @@ func TestRowsColumnTypes(t *testing.T) { }) } +// EXPLAIN returns Nullable = false for column "Extra", but value is NULL. :( +func TestNullableEXPLAIN(t *testing.T) { + runTests(t, dsn, func(dbt *DBTest) { + rows, err := dbt.db.Query("EXPLAIN SELECT * FROM mysql.user") + if err != nil { + t.Fatalf("Query: %v", err) + } + + tt, err := rows.ColumnTypes() + if err != nil { + t.Fatalf("ColumnTypes: %v", err) + } + colExtra := len(tt) - 1 + colInfo := tt[colExtra] + t.Logf("Column %d:", colExtra) + t.Logf("Name: %s", colInfo.Name()) + t.Logf("iDatabaseTypeName: %s", colInfo.DatabaseTypeName()) + nullable, ok := colInfo.Nullable() + t.Logf("Nullable: %v (ok: %v)", nullable, ok) + values := make([]interface{}, len(tt)) + for i := range values { + nullable, ok := tt[i].Nullable() + if !ok { + nullable = true + } + if nullable { + values[i] = new(*string) + } else { + values[i] = new(string) + } + } + + for rows.Next() { + err = rows.Scan(values...) + if err != nil { + t.Fatalf("failed to scan values in %v", err) + } + } + if err := rows.Close(); err != nil { + t.Errorf("error closing rows: %s", err) + } + }) +} + func TestValuerWithValueReceiverGivenNilValue(t *testing.T) { runTests(t, dsn, func(dbt *DBTest) { dbt.mustExec("CREATE TABLE test (value VARCHAR(255))")