{"record":{"id":"344d488fbc12e72b","repo":"t8y2/dbx","slug":"table-is-required-344d48","errorCode":null,"errorMessage":"table is required","messagePattern":"table is required","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"agents/drivers/hive-go/metadata.go","lineNumber":608,"sourceCode":"\t\t}\n\t}\n\treturn false\n}\n\n// acceptsRoutineType reports whether the requested object types include the\n// given routine kind (case-insensitive).\nfunc acceptsRoutineType(objectTypes []string, routineType string) bool {\n\tfor _, objectType := range objectTypes {\n\t\tif strings.EqualFold(objectType, routineType) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (server *server) getColumns(schema, table string) ([]columnInfo, error) {\n\tif strings.TrimSpace(table) == \"\" {\n\t\treturn nil, errors.New(\"table is required\")\n\t}\n\tschema = firstNonEmpty(schema, server.config.Database)\n\tmetadataResult, metadataErr := server.hiveMetadata(func(ctx context.Context, provider gohive.MetadataProvider) (gohive.MetadataResult, error) {\n\t\treturn provider.GetHiveColumns(ctx, schema, table, \"%\")\n\t})\n\tif metadataErr == nil {\n\t\trows := newHiveMetadataRows(metadataResult)\n\t\tvalues := make([]columnInfo, 0, len(rows.rows))\n\t\tfor _, row := range rows.rows {\n\t\t\tname := metadataString(rows.value(row, \"COLUMN_NAME\"))\n\t\t\tif name == \"\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tdataType := metadataString(rows.value(row, \"TYPE_NAME\"))\n\t\t\tcolumnSize := metadataIntPointer(rows.value(row, \"COLUMN_SIZE\"))\n\t\t\tvalues = append(values, columnInfo{\n\t\t\t\tName:                   name,\n\t\t\t\tDataType:               dataType,","sourceCodeStart":590,"sourceCodeEnd":626,"githubUrl":"https://github.com/t8y2/dbx/blob/c0390bff16418b651f4728520d99adf8ce48829a/agents/drivers/hive-go/metadata.go#L590-L626","documentation":"getColumns() validates that a non-blank table name was supplied before running GetHiveColumns against HiveServer2. An empty or whitespace-only table name cannot be resolved to column metadata, so the call is rejected up front with this error.","triggerScenarios":"Calling getColumns / the dispatch getColumns entry point with table=\"\" or table=\"   \" (schema may be empty — it defaults to config.Database — but table must be set).","commonSituations":"Client UI or ORM passes an empty table identifier because a previous listing step failed; JSON request omits the \"table\" field; dynamic SQL generation produces blank table names on empty inputs.","solutions":["Pass a non-empty table name to the getColumns call.","Trim and validate the table parameter at the client/request boundary before invoking the driver.","Verify upstream code that derives the table name (parser, router) actually populates it for this request.","If you need all columns without a table, list tables first and then query columns per table."],"exampleFix":"// before\ngetColumns(\"default\", \"\") // error: table is required\n// after\nif strings.TrimSpace(tableName) == \"\" {\n    return errors.New(\"client: table name must be provided\")\n}\ngetColumns(\"default\", tableName)","handlingStrategy":"validation","validationCode":"if strings.TrimSpace(table) == \"\" {\n    return errors.New(\"table name is required for getColumns\")\n}","typeGuard":null,"tryCatchPattern":"cols, err := srv.GetColumns(schema, table)\nif err != nil && strings.Contains(err.Error(), \"table is required\") {\n    return fmt.Errorf(\"caller bug: empty table for getColumns (schema=%q)\", schema)\n}","preventionTips":["Validate the table field in request handlers.","Trim identifiers before calling metadata APIs.","Ensure listing flows always populate the selected table."],"tags":["hive","validation","metadata","missing-argument","go"],"backgroundTag":"missing-required-parameter","analyzedSha":"c0390bff16418b651f4728520d99adf8ce48829a","analyzedAt":"2026-09-05T23:05:10.900Z","contentChangedAt":"2026-09-05T23:05:10.900Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}