t8y2/dbx · error

Hive driver does not expose HiveServer2 metadata RPCs

Error message

Hive driver does not expose HiveServer2 metadata RPCs

What it means

The driver wraps the underlying gohive connection via connection.Raw and expects it to implement gohive.MetadataProvider to run HiveServer2 metadata RPCs (GetHiveColumns, GetHiveTables, etc.). If the raw driver connection does not implement that interface, this error is returned — meaning the installed gohive version or underlying driver cannot expose HiveServer2 metadata RPCs.

Source

Thrown at agents/drivers/argo-go/metadata.go:188

}

func normalizeMetadataColumn(value string) string {
	return strings.NewReplacer("_", "", "-", "", " ", "").Replace(strings.ToUpper(strings.TrimSpace(value)))
}

func (server *server) hiveMetadata(operation func(context.Context, gohive.MetadataProvider) (gohive.MetadataResult, error)) (gohive.MetadataResult, error) {
	connection, err := server.requireConnection()
	if err != nil {
		return gohive.MetadataResult{}, err
	}
	ctx, cancel := context.WithCancel(context.Background())
	server.setActiveOperation(cancel)
	defer server.clearActiveOperation(cancel)
	var result gohive.MetadataResult
	err = connection.Raw(func(rawConnection any) error {
		provider, ok := rawConnection.(gohive.MetadataProvider)
		if !ok {
			return errors.New("Hive driver does not expose HiveServer2 metadata RPCs")
		}
		var operationErr error
		result, operationErr = operation(ctx, provider)
		return operationErr
	})
	return result, err
}

func (server *server) connectionInfo() (map[string]any, error) {
	version := ""
	if result, err := server.executeQuery(queryOptions{SQL: "SELECT VERSION()", MaxRows: 1, TimeoutSecs: 5}); err == nil && len(result.Rows) > 0 && len(result.Rows[0]) > 0 {
		version = stringValue(result.Rows[0][0])
	}
	username := server.config.Username
	if result, err := server.executeQuery(queryOptions{SQL: "SELECT CURRENT_USER()", MaxRows: 1, TimeoutSecs: 5}); err == nil && len(result.Rows) > 0 && len(result.Rows[0]) > 0 {
		if current := stringValue(result.Rows[0][0]); current != "" {
			username = current
		}

View on GitHub (pinned to c0390bff16)

Solutions

  1. Upgrade the gohive dependency to a version that implements gohive.MetadataProvider
  2. Remove or bypass any wrapper around the driver connection so Raw returns the actual gohive connection
  3. Verify the connection is genuinely a gohive Hive connection, not another driver type
  4. Add a fallback metadata path (SHOW queries) when the interface is unavailable

Example fix

// before
_ = "github.com/beltran/gohive v0.x (no MetadataProvider)"
// after
import "github.com/beltran/gohive" // go.mod updated to a version with gohive.MetadataProvider
// go get github.com/beltran/gohive@latest
Defensive patterns

Strategy: type-guard

Type guard

func supportsMetadata(raw any) bool {
    _, ok := raw.(gohive.MetadataProvider)
    return ok
}
// usage:
// var raw any
// _ = connection.Raw(func(r any) error { raw = r; return nil })
// if !supportsMetadata(raw) { /* fall back to SHOW-based metadata */ }

Try / catch

result, err := server.getColumns(schema, table)
if err != nil && strings.Contains(err.Error(), "does not expose HiveServer2 metadata RPCs") {
    // fall back to DESCRIBE-formatted / SHOW COLUMNS queries
}

Prevention

When it happens

Trigger: Calling any metadata function that funnels through hiveMetadata (getColumns, getTableComment, listTables metadata paths) when the raw connection obtained from connection.Raw fails the gohive.MetadataProvider type assertion.

Common situations: Using an older gohive version that predates the MetadataProvider interface; a wrapped/proxied driver (tracing middleware, database/sql decorator) that hides the real gohive connection type; wrong dialect connection stored on the server.

Related errors


AI-assisted analysis of t8y2/dbx@c0390bff16 (2026-09-05). Data as JSON: /api/errors/bc0d384dbee8203e. Report an issue: GitHub.