func (r otRows) ColumnTypeNullable(index int) (nullable, ok bool) {
	if v, ok := r.Rows.(driver.RowsColumnTypeNullable); ok {
		return v.ColumnTypeNullable(index)
	}
	return false, false
}
ColumnTypeNullable calls the implements the driver.RowsColumnTypeNullable for otRows.
It returns the the underlying result of ColumnTypeNullable from the otRows.Rows
if the Rows implements driver.RowsColumnTypeNullable.
package otelsql
import (
	"context"
	"database/sql/driver"
	"io"
	"go.opentelemetry.io/otel/trace"
)
var (
	_ driver.Rows                           = (*otRows)(nil)
	_ driver.RowsNextResultSet              = (*otRows)(nil)
	_ driver.RowsColumnTypeDatabaseTypeName = (*otRows)(nil)
	_ driver.RowsColumnTypeLength           = (*otRows)(nil)
	_ driver.RowsColumnTypeNullable         = (*otRows)(nil)
	_ driver.RowsColumnTypePrecisionScale   = (*otRows)(nil)
)
type otRows struct {
	driver.Rows
	span trace.Span
	cfg  config
}
func newRows(ctx context.Context, rows driver.Rows, cfg config) *otRows {
	var span trace.Span
	if cfg.SpanOptions.AllowRoot || trace.SpanContextFromContext(ctx).IsValid() {
		_, span = cfg.Tracer.Start(ctx, cfg.SpanNameFormatter.Format(ctx, MethodRows, ""),
			trace.WithSpanKind(trace.SpanKindClient),
			trace.WithAttributes(cfg.Attributes...),
		)
	}
	return &otRows{
		Rows: rows,
		span: span,
		cfg:  cfg,
	}
}
func (r otRows) HasNextResultSet() bool {
	if v, ok := r.Rows.(driver.RowsNextResultSet); ok {
		return v.HasNextResultSet()
	}
	return false
}
func (r otRows) NextResultSet() error {
	if v, ok := r.Rows.(driver.RowsNextResultSet); ok {
		return v.NextResultSet()
	}
	return io.EOF
}
func (r otRows) ColumnTypeDatabaseTypeName(index int) string {
	if v, ok := r.Rows.(driver.RowsColumnTypeDatabaseTypeName); ok {
		return v.ColumnTypeDatabaseTypeName(index)
	}
	return ""
}
func (r otRows) ColumnTypeLength(index int) (length int64, ok bool) {
	if v, ok := r.Rows.(driver.RowsColumnTypeLength); ok {
		return v.ColumnTypeLength(index)
	}
	return 0, false
}