Instead of introducing a new method on PColumn, change isCoercibleTo to take four more arguments, srcMaxLength, srcScale, and targetMaxLength, targetScale. I don't think the check belongs on column, it's really associated with a type (DECIMAL and CHAR could both check the maxLength and DECIMAL the scale). There are two variants of isCoercibleTo - one that take a value and one that doesn't. I think you'll need to change both of them - you'll see a usage in the UPSERT SELECT case for the non value version of the function.