aboutsummaryrefslogtreecommitdiff
path: root/src/database/sql/sql.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/database/sql/sql.go')
-rw-r--r--src/database/sql/sql.go33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/database/sql/sql.go b/src/database/sql/sql.go
index 836fe83e2e..7a57c7de36 100644
--- a/src/database/sql/sql.go
+++ b/src/database/sql/sql.go
@@ -391,6 +391,39 @@ func (n NullTime) Value() (driver.Value, error) {
return n.Time, nil
}
+// Null represents a value that may be null.
+// Null implements the Scanner interface so
+// it can be used as a scan destination:
+//
+// var s Null[string]
+// err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&s)
+// ...
+// if s.Valid {
+// // use s.V
+// } else {
+// // NULL value
+// }
+type Null[T any] struct {
+ V T
+ Valid bool
+}
+
+func (n *Null[T]) Scan(value any) error {
+ if value == nil {
+ n.V, n.Valid = *new(T), false
+ return nil
+ }
+ n.Valid = true
+ return convertAssign(&n.V, value)
+}
+
+func (n Null[T]) Value() (driver.Value, error) {
+ if !n.Valid {
+ return nil, nil
+ }
+ return n.V, nil
+}
+
// Scanner is an interface used by Scan.
type Scanner interface {
// Scan assigns a value from a database driver.