{"record":{"id":"aa9574b62c214632","repo":"pocketbase/pocketbase","slug":"failed-to-initialize-relation-field-q","errorCode":null,"errorMessage":"failed to initialize relation field %q","messagePattern":"failed to initialize relation field %q","errorType":"exception","errorClass":null,"httpStatus":400,"severity":"error","filePath":"core/record_field_resolver_runner.go","lineNumber":643,"sourceCode":"\t\t\t}\n\n\t\t\tr.multiMatchActiveTableAlias = newTableAlias2\n\t\t\t// ---\n\n\t\t\tcontinue\n\t\t}\n\t\t// -----------------------------------------------------------\n\n\t\t// check for direct relation\n\t\tif field.Type() != FieldTypeRelation {\n\t\t\treturn nil, fmt.Errorf(\"field %q is not a valid relation\", prop)\n\t\t}\n\n\t\t// join the relation to the main query\n\t\t// ---\n\t\trelField, ok := field.(*RelationField)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"failed to initialize relation field %q\", prop)\n\t\t}\n\n\t\trelCollection, relErr := r.resolver.loadCollection(relField.CollectionId)\n\t\tif relErr != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to load field %q collection\", prop)\n\t\t}\n\n\t\t// \"id\" lookups optimization for single relations to avoid unnecessary joins,\n\t\t// aka. \"user.id\" and \"user\" should produce the same query identifier\n\t\tif !relField.IsMultiple() &&\n\t\t\t// the penultimate prop is \"id\"\n\t\t\ti == totalProps-2 && r.activeProps[i+1] == FieldNameId {\n\t\t\treturn r.finalizeActivePropsProcessing(collection, relField.Name, i)\n\t\t}\n\n\t\tcleanFieldName := inflector.Columnify(relField.Name)\n\t\tprefixedFieldName := r.activeTableAlias + \".\" + cleanFieldName\n\t\tnewTableAlias := r.activeTableAlias + \"_\" + cleanFieldName + r.resolver.joinAliasSuffix","sourceCodeStart":625,"sourceCodeEnd":661,"githubUrl":"https://github.com/pocketbase/pocketbase/blob/5d217ddb50cb144d80a5d0b0bdf11b52b2c3e457/core/record_field_resolver_runner.go#L625-L661","documentation":"Internal invariant: a field whose Type() is FieldTypeRelation failed the assertion to *RelationField during direct-relation joining. Should not occur with built-in field types; custom field plugins returning the relation type without embedding RelationField are the usual cause.","triggerScenarios":"A dotted filter path traversing a custom field that claims FieldTypeRelation but is not a *RelationField implementation.","commonSituations":"Buggy third-party field plugins; modified PocketBase forks; version mismatches after upgrading core while keeping old plugins.","solutions":["Replace the custom field with a standard relation field.","Fix or update the plugin so relation-typed fields implement/extend core.RelationField.","Pin compatible versions of core and plugins."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":"func isStandardRelation(f core.Field) bool {\n    if f.Type() != core.FieldTypeRelation {\n        return false\n    }\n    _, ok := f.(*core.RelationField)\n    return ok\n}","tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"failed to initialize relation field\") {\n    log.Error(\"field plugin/type mismatch\", \"field\", prop)\n    return errors.New(\"unsupported relation field implementation\")\n}","preventionTips":["Use built-in relation fields for joinable paths.","Test custom plugins against dotted filter resolution.","Upgrade plugins together with core."],"tags":["go","resolver","plugin","internal"],"backgroundTag":null,"analyzedSha":"5d217ddb50cb144d80a5d0b0bdf11b52b2c3e457","analyzedAt":"2026-08-15T10:06:33.165Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}