| 1074 | } |
| 1075 | |
| 1076 | func TestNULL(t *testing.T) { |
| 1077 | runTestsParallel(t, dsn, func(dbt *DBTest, tbl string) { |
| 1078 | nullStmt, err := dbt.db.Prepare("SELECT NULL") |
| 1079 | if err != nil { |
| 1080 | dbt.Fatal(err) |
| 1081 | } |
| 1082 | defer nullStmt.Close() |
| 1083 | |
| 1084 | nonNullStmt, err := dbt.db.Prepare("SELECT 1") |
| 1085 | if err != nil { |
| 1086 | dbt.Fatal(err) |
| 1087 | } |
| 1088 | defer nonNullStmt.Close() |
| 1089 | |
| 1090 | // NullBool |
| 1091 | var nb sql.NullBool |
| 1092 | // Invalid |
| 1093 | if err = nullStmt.QueryRow().Scan(&nb); err != nil { |
| 1094 | dbt.Fatal(err) |
| 1095 | } |
| 1096 | if nb.Valid { |
| 1097 | dbt.Error("valid NullBool which should be invalid") |
| 1098 | } |
| 1099 | // Valid |
| 1100 | if err = nonNullStmt.QueryRow().Scan(&nb); err != nil { |
| 1101 | dbt.Fatal(err) |
| 1102 | } |
| 1103 | if !nb.Valid { |
| 1104 | dbt.Error("invalid NullBool which should be valid") |
| 1105 | } else if nb.Bool != true { |
| 1106 | dbt.Errorf("Unexpected NullBool value: %t (should be true)", nb.Bool) |
| 1107 | } |
| 1108 | |
| 1109 | // NullFloat64 |
| 1110 | var nf sql.NullFloat64 |
| 1111 | // Invalid |
| 1112 | if err = nullStmt.QueryRow().Scan(&nf); err != nil { |
| 1113 | dbt.Fatal(err) |
| 1114 | } |
| 1115 | if nf.Valid { |
| 1116 | dbt.Error("valid NullFloat64 which should be invalid") |
| 1117 | } |
| 1118 | // Valid |
| 1119 | if err = nonNullStmt.QueryRow().Scan(&nf); err != nil { |
| 1120 | dbt.Fatal(err) |
| 1121 | } |
| 1122 | if !nf.Valid { |
| 1123 | dbt.Error("invalid NullFloat64 which should be valid") |
| 1124 | } else if nf.Float64 != float64(1) { |
| 1125 | dbt.Errorf("unexpected NullFloat64 value: %f (should be 1.0)", nf.Float64) |
| 1126 | } |
| 1127 | |
| 1128 | // NullInt64 |
| 1129 | var ni sql.NullInt64 |
| 1130 | // Invalid |
| 1131 | if err = nullStmt.QueryRow().Scan(&ni); err != nil { |
| 1132 | dbt.Fatal(err) |
| 1133 | } |