{"record":{"id":"93a80729cc7d7514","repo":"apache/iceberg","slug":"cannot-parse-order-parser-is-not-an-iceberg-exten-93a807","errorCode":null,"errorMessage":"Cannot parse order: parser is not an Iceberg ExtendedParser","messagePattern":"Cannot parse order: parser is not an Iceberg ExtendedParser","errorType":"exception","errorClass":"java.lang.IllegalStateException","httpStatus":null,"severity":"error","filePath":"spark/v4.2/spark/src/main/java/org/apache/iceberg/spark/ExtendedParser.java","lineNumber":67,"sourceCode":"      return direction;\n    }\n\n    public NullOrder nullOrder() {\n      return nullOrder;\n    }\n  }\n\n  static List<RawOrderField> parseSortOrder(SparkSession spark, String orderString) {\n    ExtendedParser extParser = findParser(spark.sessionState().sqlParser(), ExtendedParser.class);\n    if (extParser != null) {\n      try {\n        return extParser.parseSortOrder(orderString);\n      } catch (AnalysisException e) {\n        throw new IllegalArgumentException(\n            String.format(\"Unable to parse sortOrder: %s\", orderString), e);\n      }\n    } else {\n      throw new IllegalStateException(\n          \"Cannot parse order: parser is not an Iceberg ExtendedParser\");\n    }\n  }\n\n  private static <T> T findParser(ParserInterface parser, Class<T> clazz) {\n    ParserInterface current = parser;\n    while (current != null) {\n      if (clazz.isInstance(current)) {\n        return clazz.cast(current);\n      }\n\n      current = getNextDelegateParser(current);\n    }\n\n    return null;\n  }\n\n  private static ParserInterface getNextDelegateParser(ParserInterface parser) {","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.2/spark/src/main/java/org/apache/iceberg/spark/ExtendedParser.java#L49-L85","documentation":"parseSortOrder requires the session's current SQL parser to be an Iceberg ExtendedParser (found by unwrapping delegates). If it is not, it throws IllegalStateException 'Cannot parse order: parser is not an Iceberg ExtendedParser', meaning Iceberg's sort-order syntax cannot be handled.","triggerScenarios":"Running WRITE ORDERED BY / CREATE ... ORDERED BY without the IcebergSparkSqlExtensions enabled, so the session parser is Spark's default rather than the Iceberg ExtendedParser.","commonSituations":"spark.sql.extensions not configured or overridden by another extensions setting; multiple extensions set without including Iceberg's; parser wrapped so findParser cannot locate it.","solutions":["Set spark.sql.extensions to include org.apache.iceberg.spark.extensions.IcebergSparkSqlExtensions","If multiple extensions are needed, use a comma-separated list including Iceberg's","Verify via SHOW/EXPLAIN or sessionState that the active parser is Iceberg's","Upgrade Iceberg if your Spark version wraps parsers in a way findParser cannot unwrap"],"exampleFix":"// before\nspark.conf.set(\"spark.sql.extensions\", \"com.other.MyExtensions\")\n// after\nspark.conf.set(\"spark.sql.extensions\", \"com.other.MyExtensions,org.apache.iceberg.spark.extensions.IcebergSparkSqlExtensions\")","handlingStrategy":"validation","validationCode":"String ext = spark.conf().get(\"spark.sql.extensions\", \"\");\nif (!ext.contains(\"org.apache.iceberg.spark.extensions.IcebergSparkSqlExtensions\")) {\n  throw new IllegalStateException(\"Enable IcebergSparkSqlExtensions before using ORDERED BY\");\n}","typeGuard":"static boolean hasIcebergParser(SparkSession spark) {\n  return ExtendedParser.parseSortOrderAccessible(spark); // or check spark.sessionState().sqlParser()\n}","tryCatchPattern":"try {\n  runOrderedByDdl();\n} catch (IllegalStateException e) {\n  if (e.getMessage().contains(\"not an Iceberg ExtendedParser\")) {\n    log.error(\"Set spark.sql.extensions to include IcebergSparkSqlExtensions\");\n  } else throw e;\n}","preventionTips":["Always configure spark.sql.extensions with Iceberg's extensions when using Iceberg DDL","When chaining multiple extensions, include Iceberg's in the comma list","Smoke-test DDL syntax in a session with the extensions enabled"],"tags":["spark","configuration","parser"],"backgroundTag":"invalid-config-value","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}