{"record":{"id":"27250e7359549146","repo":"apache/iceberg","slug":"wrong-arg-type-for-param-name-cannot-cast-arg","errorCode":null,"errorMessage":"Wrong arg type for ${param.name}: cannot cast $argType to $paramType","messagePattern":"Wrong arg type for (.+?): cannot cast \\$argType to \\$paramType","errorType":"exception","errorClass":"AnalysisException","httpStatus":null,"severity":"error","filePath":"spark/v3.5/spark-extensions/src/main/scala/org/apache/spark/sql/catalyst/analysis/ProcedureArgumentCoercion.scala","lineNumber":38,"sourceCode":"\nimport org.apache.spark.sql.AnalysisException\nimport org.apache.spark.sql.catalyst.expressions.Cast\nimport org.apache.spark.sql.catalyst.plans.logical.Call\nimport org.apache.spark.sql.catalyst.plans.logical.LogicalPlan\nimport org.apache.spark.sql.catalyst.rules.Rule\n\nobject ProcedureArgumentCoercion extends Rule[LogicalPlan] {\n  override def apply(plan: LogicalPlan): LogicalPlan = plan resolveOperators {\n    case c @ Call(procedure, args) if c.resolved =>\n      val params = procedure.parameters\n\n      val newArgs = args.zipWithIndex.map { case (arg, index) =>\n        val param = params(index)\n        val paramType = param.dataType\n        val argType = arg.dataType\n\n        if (paramType != argType && !Cast.canUpCast(argType, paramType)) {\n          throw new AnalysisException(\n            s\"Wrong arg type for ${param.name}: cannot cast $argType to $paramType\")\n        }\n\n        if (paramType != argType) {\n          Cast(arg, paramType)\n        } else {\n          arg\n        }\n      }\n\n      if (newArgs != args) {\n        c.copy(args = newArgs)\n      } else {\n        c\n      }\n  }\n}\n","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v3.5/spark-extensions/src/main/scala/org/apache/spark/sql/catalyst/analysis/ProcedureArgumentCoercion.scala#L20-L56","documentation":"Thrown by ProcedureArgumentCoercion when a CALL argument's data type cannot be safely up-cast to the corresponding procedure parameter's type. Iceberg only allows implicit upcasts (via Cast.canUpCast); anything else fails analysis.","triggerScenarios":"CALL catalog.system.procedure(arg) where e.g. an INT argument targets a STRING parameter, or a DOUBLE targets an INT parameter — no lossless upcast exists.","commonSituations":"Passing string literals for typed parameters (timestamps, longs); calling procedures ported across Spark versions where default literal types changed (e.g. DECIMAL vs DOUBLE literals); mismatched parameter order so the value lands on the wrong typed parameter.","solutions":["Add an explicit CAST to the parameter's type in the CALL, e.g. CAST('2024-01-01' AS TIMESTAMP)","Check the procedure signature and reorder arguments so each value's type upcasts to the parameter type","Use a typed literal (e.g. TIMESTAMP '2024-01-01', 5L) instead of an untyped literal"],"exampleFix":"// before\nCALL catalog.system.rewrite_data_files(table => 'db.t', where => 'ts > 2024-01-01')\n// after\nCALL catalog.system.rewrite_data_files(table => 'db.t', where => cast('ts > ''2024-01-01''' as string))","handlingStrategy":"validation","validationCode":"// before CALL, ensure each literal's type upcasts:\n// e.g. for a TIMESTAMP param use TIMESTAMP '2024-01-01', for LONG use 5L\nval argType = expr.exprType\nrequire(Cast.canUpCast(argType, paramType), s\"cannot cast $argType to $paramType\")","typeGuard":null,"tryCatchPattern":"try { spark.sql(callSql) } catch { case e: AnalysisException if e.getMessage.contains(\"Wrong arg type for\") => // add explicit CAST }","preventionTips":["Use typed literals (TIMESTAMP '...', 5L, DATE '...') for typed procedure parameters","Match argument order to the declared parameter order","Check the procedure signature docs before calling"],"tags":["spark","sql","call-procedure","type-coercion"],"backgroundTag":"type-mismatch","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}