Skip to content

Feature: support sql.NullString/sql.NullInt64 in Scan() #59

@bwish71

Description

@bwish71

Summary

gorqlite's Scan() supports custom nullable types (gorqlite.NullString, gorqlite.NullInt64, etc.) but does not support the standard library equivalents (sql.NullString, sql.NullInt64, sql.NullFloat64, sql.NullBool).

Attempting to scan into *sql.NullString returns:

unknown destination type (*sql.NullString) to scan into in variable #1

Motivation

Many Go codebases use database/sql nullable types as their standard pattern for handling NULL columns. When migrating to rqlite/gorqlite, users must rewrite all nullable field handling to use gorqlite-specific types or COALESCE workarounds. Supporting sql.Null* types natively would make gorqlite a drop-in replacement for more database/sql patterns.

Proposed Change

Add cases to the type switch in Scan() (query.go) for each sql.Null* type. For example:

case *sql.NullString:
    switch src := src.(type) {
    case string:
        *d = sql.NullString{Valid: true, String: src}
    case nil:
        *d = sql.NullString{Valid: false}
    default:
        return fmt.Errorf("invalid string col:%d type:%T val:%v", n, src, src)
    }

This would be ~30 lines of additions, fully backward-compatible, and follows the same pattern already used for gorqlite.NullString.

Types to add

  • *sql.NullString
  • *sql.NullInt64
  • *sql.NullInt32
  • *sql.NullInt16
  • *sql.NullFloat64
  • *sql.NullBool
  • *sql.NullTime

Environment

  • gorqlite commit: ac86a4a (2025-06-09)
  • Go 1.21+

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions