t8y2/dbx · error

Hive connection string must start with jdbc:hive2:// or hive

Error message

Hive connection string must start with jdbc:hive2:// or hive://

What it means

The Hive driver parses connection strings and only accepts two schemes: jdbc:hive2:// and hive://. Any other prefix reaches the final else branch and is rejected. This prevents silently treating a malformed DSN as a host.

Source

Thrown at agents/drivers/hive-go/config.go:332

		}
		port := defaultHivePort
		if parsedURL.Port() != "" {
			parsedPort, err := strconv.Atoi(parsedURL.Port())
			if err != nil {
				return parsedHiveConnection{}, fmt.Errorf("invalid Hive port: %w", err)
			}
			port = parsedPort
		}
		result.endpoints = []endpoint{{Host: parsedURL.Hostname(), Port: port}}
		result.database = strings.Trim(parsedURL.Path, "/")
		for key, entries := range parsedURL.Query() {
			if len(entries) > 0 {
				setCaseInsensitive(result.parameters, key, entries[len(entries)-1])
			}
		}
		return result, nil
	} else {
		return parsedHiveConnection{}, errors.New("Hive connection string must start with jdbc:hive2:// or hive://")
	}

	result := newParsedHiveConnection()
	if fragment := strings.IndexByte(value, '#'); fragment >= 0 {
		result.hiveVars = parseHiveAssignments(value[fragment+1:], false)
		value = value[:fragment]
	}
	if query := strings.IndexByte(value, '?'); query >= 0 {
		result.hiveConfs = parseHiveAssignments(value[query+1:], false)
		value = value[:query]
	}
	pathStart := strings.IndexByte(value, '/')
	authority := value
	pathAndParams := ""
	if pathStart >= 0 {
		authority = value[:pathStart]
		pathAndParams = value[pathStart+1:]
	}

View on GitHub (pinned to c0390bff16)

Solutions

  1. Prefix the value with jdbc:hive2:// (the standard HiveServer2 JDBC form) or the shorthand hive://.
  2. Strip any wrong scheme before passing (e.g. convert hive2://host to jdbc:hive2://host).
  3. Validate the scheme in application code before handing the DSN to the driver.

Example fix

// before
dsn := "hive2://hiveserver:10000/default"
// after
dsn := "jdbc:hive2://hiveserver:10000/default"
Defensive patterns

Strategy: validation

Validate before calling

func normalizeHiveDSN(v string) string {
    switch {
    case strings.HasPrefix(v, "jdbc:hive2://"), strings.HasPrefix(v, "hive://"):
        return v
    case strings.HasPrefix(v, "hive2://"):
        return "jdbc:" + v
    default:
        return "jdbc:hive2://" + v
    }
}

Type guard

func isHiveDSN(v string) bool {
    return strings.HasPrefix(v, "jdbc:hive2://") || strings.HasPrefix(v, "hive://")
}

Prevention

When it happens

Trigger: Passing DSNs like 'hive2://host', 'jdbc:hive://host', 'http://host:10000', 'host:10000' (no scheme) or 'thrift://host' to the config parser.

Common situations: Migrating from tools that accept bare hostnames, mixing up hive2 vs jdbc:hive2, templated DSNs where the scheme placeholder wasn't substituted.

Related errors


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