{"record":{"id":"92507b3d59204937","repo":"apache/seatunnel","slug":"graphql-sink-parameter-error","errorCode":"GRAPHQL_SINK_PARAMETER_ERROR","errorMessage":"GraphQL Sink unsupported operation type: ${operationType}","messagePattern":"GraphQL Sink unsupported operation type: (.+?)","errorType":"error_code","errorClass":"GraphQLConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-graphql/src/main/java/org/apache/seatunnel/connectors/seatunnel/graphql/util/GraphQLUtil.java","lineNumber":94,"sourceCode":"                .findFirst()\n                .map(OperationDefinition::getOperation)\n                .orElse(null);\n    }\n\n    public static void validateSinkOperation(String query) {\n        if (query == null || query.isEmpty()) {\n            throw new GraphQLConnectorException(\n                    GraphQLConnectorErrorCode.GRAPHQL_SOURCE_PARAMETER_ERROR,\n                    \"GraphQL Sink query is required.\");\n        }\n        OperationDefinition.Operation operationType = parseOperationType(query);\n        switch (operationType) {\n            case MUTATION:\n                break;\n            case SUBSCRIPTION:\n            case QUERY:\n            default:\n                throw new GraphQLConnectorException(\n                        GraphQLConnectorErrorCode.GRAPHQL_SINK_PARAMETER_ERROR,\n                        \"GraphQL Sink unsupported operation type: \" + operationType);\n        }\n    }\n\n    public static void validateSourceOperation(String query, Boolean enableSubscription) {\n        if (query == null) {\n            throw new GraphQLConnectorException(\n                    GraphQLConnectorErrorCode.GRAPHQL_SOURCE_PARAMETER_ERROR,\n                    \"GraphQL Source is required.\");\n        }\n        OperationDefinition.Operation operationType;\n        try {\n            operationType = parseOperationType(query);\n        } catch (Exception e) {\n            throw new GraphQLConnectorException(\n                    GraphQLConnectorErrorCode.GRAPHQL_SOURCE_PARAMETER_ERROR,\n                    \"Failed to parse operation type from query: \" + e.getMessage());","sourceCodeStart":76,"sourceCodeEnd":112,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-graphql/src/main/java/org/apache/seatunnel/connectors/seatunnel/graphql/util/GraphQLUtil.java#L76-L112","documentation":"After parsing the sink query's operation type, validateSinkOperation only allows MUTATION. QUERY, SUBSCRIPTION, or unrecognized operations throw GRAPHQL_SINK_PARAMETER_ERROR with the offending type. Sinks write data, so only mutations are valid.","triggerScenarios":"The configured sink query's root operation is a query or subscription, e.g. user pasted a source query into the sink, or the document has no explicit operation keyword so parsing yields a default/unexpected type.","commonSituations":"Copy-pasting the source query into the sink config; writing a document without an explicit 'mutation' keyword; anonymous query documents.","solutions":["Change the sink query to start with the 'mutation' keyword","Remove the query/subscription document and write a proper mutation","Verify with: parseOperationType or running the query in GraphiQL","Keep source queries in the source config and mutations in the sink config"],"exampleFix":"// before\nquery = \"query { users { id name } }\"\n// after\nquery = \"mutation ($name: String!) { createUser(name: $name) { id } }\"","handlingStrategy":"validation","validationCode":"// check operation keyword before configuring sink\nif (!query.trim().startsWith(\"mutation\")) throw new IllegalArgumentException(\"sink query must be a mutation\");","typeGuard":"boolean isMutation = query != null && query.trim().toLowerCase().startsWith(\"mutation\");","tryCatchPattern":"try { GraphQLUtil.validateSinkOperation(query); } catch (GraphQLConnectorException e) { log.error(\"sink query must be a mutation, got: {}\", e.getMessage()); }","preventionTips":["Never reuse the source query in the sink","Start sink documents with explicit 'mutation' keyword","Test the mutation in GraphiQL first"],"tags":["graphql","config","validation","sink","mutation"],"backgroundTag":"invalid-enum-value","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}