{"record":{"id":"5b1a3bb76c25986a","repo":"apache/seatunnel","slug":"cannot-convert-to-boolean","errorCode":null,"errorMessage":"Cannot convert to boolean: ","messagePattern":"Cannot convert to boolean: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-iceberg/src/main/java/org/apache/seatunnel/connectors/seatunnel/iceberg/data/RowConverter.java","lineNumber":346,"sourceCode":"            } else {\n                bigDecimal = BigDecimal.valueOf(dbl);\n            }\n        } else if (value instanceof String) {\n            bigDecimal = new BigDecimal((String) value);\n        } else {\n            throw new IllegalArgumentException(\n                    \"Cannot convert to BigDecimal: \" + value.getClass().getName());\n        }\n        return bigDecimal.setScale(type.scale(), RoundingMode.HALF_UP);\n    }\n\n    protected boolean convertBoolean(Object value) {\n        if (value instanceof Boolean) {\n            return (boolean) value;\n        } else if (value instanceof String) {\n            return Boolean.parseBoolean((String) value);\n        }\n        throw new IllegalArgumentException(\n                \"Cannot convert to boolean: \" + value.getClass().getName());\n    }\n\n    protected String convertString(Object value) {\n        try {\n            if (value instanceof String) {\n                return (String) value;\n            } else if (value instanceof Number || value instanceof Boolean) {\n                return value.toString();\n            } else if (value instanceof Map || value instanceof List) {\n                return MAPPER.writeValueAsString(value);\n            } else {\n                return MAPPER.writeValueAsString(value);\n            }\n        } catch (IOException e) {\n            throw new UncheckedIOException(e);\n        }\n    }","sourceCodeStart":328,"sourceCodeEnd":364,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-iceberg/src/main/java/org/apache/seatunnel/connectors/seatunnel/iceberg/data/RowConverter.java#L328-L364","documentation":"Iceberg RowConverter throws this when a boolean column value is neither Boolean nor String. Only those two input types are supported by convertBoolean; anything else (e.g. Integer 0/1) is rejected. This protects against silently coercing arbitrary types to booleans.","triggerScenarios":"convertBoolean receives e.g. an Integer, Short, or BigDecimal while converting a row field mapped to an Iceberg BOOLEAN column.","commonSituations":"Sources/databases that encode booleans as numeric 0/1 (MySQL tinyint(1), Oracle NUMBER) pass Integer values to the sink; CDC formats deliver booleans as ints.","solutions":["Cast the column upstream (SELECT col::boolean or transform CAST) so the sink receives Boolean/String.","Use a transform to map 0/1 to true/false before the Iceberg sink.","Fix the source connector's type mapping so logical boolean types map to SeaTunnel BooleanType."],"exampleFix":"// before\nwriter.write(fieldIndex, 1); // Integer for boolean\n// after\nwriter.write(fieldIndex, true); // Boolean accepted by convertBoolean","handlingStrategy":"type-guard","validationCode":"if (!(v instanceof Boolean) && !(v instanceof String)) throw new IllegalArgumentException(\"boolean column must be Boolean/String, got \" + (v == null ? \"null\" : v.getClass().getName()));","typeGuard":"boolean isBooleanConvertible(Object v) { return v instanceof Boolean || v instanceof String; }","tryCatchPattern":"try { sink.write(row); } catch (IllegalArgumentException e) { if (e.getMessage().startsWith(\"Cannot convert to boolean\")) { /* coerce 0/1 or DLQ */ } else throw e; }","preventionTips":["Ensure JDBC/CDC sources map tinyint(1)/boolean logical types to SeaTunnel BooleanType","CAST 0/1 columns to BOOLEAN upstream","Test schema mapping with a sample row before running full pipelines"],"tags":["iceberg","type-conversion","boolean","sink"],"backgroundTag":"type-mismatch","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}