fix: recover from driver panic on GEOGRAPHY/GEOMETRY columns by dlevy-msft-sql · Pull Request #704 · microsoft/go-sqlcmd

Problem

sqlcmd crashes with a panic when selecting NULL for GEOGRAPHY or GEOMETRY data types:

declare @v geography
select @v
go
panic: not implemented makeGoLangScanType for type 240

Root Cause

The go-mssqldb driver panics in makeGoLangScanType when encountering type 240 (GEOGRAPHY/GEOMETRY). The rows.ColumnTypes() call propagates this panic up, crashing sqlcmd.

Code Change

Added safeColumnTypes() wrapper that uses defer/recover to catch the panic and convert it to an error:

func safeColumnTypes(rows *sql.Rows) (cols []*sql.ColumnType, err error) {
    defer func() {
        if r := recover(); r != nil {
            err = localizer.Errorf("unsupported column type: %v", r)
            cols = nil
        }
    }()
    return rows.ColumnTypes()
}

Testing

  • Build passes: go build ./...
  • New test TestSafeColumnTypesRecoversPanic passes
  • TestQueryTimeout and TestQueryServerPropertyReturnsColumnName pass with live database

Fixes #553