{"record":{"id":"b7eaedd0c506fcdd","repo":"provectus/kafka-ui","slug":"error","errorCode":null,"errorMessage":"Error: ","messagePattern":"Error: ","errorType":"exception","errorClass":"KsqlApiException","httpStatus":400,"severity":"error","filePath":"kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/ksql/response/ResponseParser.java","lineNumber":38,"sourceCode":"  public static Optional<KsqlApiClient.KsqlResponseTable> parseSelectResponse(JsonNode jsonNode) {\n    // in response, we're getting either header record or row data\n    if (arrayFieldNonEmpty(jsonNode, \"header\")) {\n      return Optional.of(\n          KsqlApiClient.KsqlResponseTable.builder()\n              .header(\"Schema\")\n              .columnNames(parseSelectHeadersString(jsonNode.get(\"header\").get(\"schema\").asText()))\n              .build());\n    }\n    if (arrayFieldNonEmpty(jsonNode, \"row\")) {\n      return Optional.of(\n          KsqlApiClient.KsqlResponseTable.builder()\n              .header(\"Row\")\n              .values(\n                  List.of(Lists.newArrayList(jsonNode.get(\"row\").get(\"columns\"))))\n              .build());\n    }\n    if (jsonNode.hasNonNull(\"errorMessage\")) {\n      throw new KsqlApiException(\"Error: \" + jsonNode.get(\"errorMessage\"));\n    }\n    // remaining events can be skipped\n    return Optional.empty();\n  }\n\n  @VisibleForTesting\n  static List<String> parseSelectHeadersString(String str) {\n    List<String> headers = new ArrayList<>();\n    int structNesting = 0;\n    boolean quotes = false;\n    var headerBuilder = new StringBuilder();\n    for (char ch : str.toCharArray()) {\n      if (ch == '<') {\n        structNesting++;\n      } else if (ch == '>') {\n        structNesting--;\n      } else if (ch == '`') {\n        quotes = !quotes;","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/provectus/kafka-ui/blob/83b5a60cc08501b570a0c4d0b4cdfceb1b88d6b7/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/ksql/response/ResponseParser.java#L20-L56","documentation":"ResponseParser.parseSelectResponse inspects each ksql push/pull query response JSON frame. When the frame carries a non-null 'errorMessage' field (the ksql server signaling a query-level failure), it throws KsqlApiException('Error: ' + that message).","triggerScenarios":"Streaming a SELECT via ksql and receiving a JSON frame from the ksqlDB server with an 'errorMessage' field — i.e. the server rejected or failed the query (bad table/topic reference, query errors).","commonSituations":"Querying non-existent streams/tables; ksqlDB server-side query failures; serialization/avro schema problems on the server; permission or config issues surfaced by ksqlDB.","solutions":["Read the ksqlDB server message appended after 'Error: ' and fix the query accordingly","Verify the stream/table names exist in ksqlDB (SHOW STREAMS / SHOW TABLES)","Check ksqlDB server logs for the full error and stack trace","Confirm topic/schema/serde configuration the query depends on"],"exampleFix":"// before\nparseSelectResponse(node); // node has errorMessage, throws at runtime\n// after\nif (node.hasNonNull(\"errorMessage\")) {\n  log.warn(\"ksql query failed: {}\", node.get(\"errorMessage\").asText()); // handle before/around parsing\n}","handlingStrategy":"try-catch","validationCode":"// Pre-check response frame shape before deep parsing\nif (node != null && node.hasNonNull(\"errorMessage\")) {\n  throw new KsqlApiException(node.get(\"errorMessage\").asText()); // handle deliberately\n}","typeGuard":null,"tryCatchPattern":"try {\n  Optional<KsqlResponseTable> t = responseParser.parseSelectResponse(jsonNode);\n} catch (KsqlApiException e) {\n  if (e.getMessage().startsWith(\"Error:\")) {\n    String serverMsg = e.getMessage().substring(\"Error:\".length()).trim();\n    log.error(\"ksqlDB query failed: {}\", serverMsg);\n  } else { throw e; }\n}","preventionTips":["Validate stream/table names exist before querying (SHOW STREAMS/TABLES)","Monitor the reactive stream's error signal (doOnError) for KsqlApiException","Check ksqlDB server health/schema registry availability before long queries","Surface the server's errorMessage text to users instead of retrying blindly"],"tags":["ksql","api","error-response","streaming"],"backgroundTag":"api-error-response","analyzedSha":"83b5a60cc08501b570a0c4d0b4cdfceb1b88d6b7","analyzedAt":"2026-09-08T04:35:39.002Z","contentChangedAt":"2026-09-08T04:35:39.002Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}