Good point. How about if PDataType.coerceBytes throws like you've described and we get rid of the if statement and the isCoercibleTo method that takes a value arg (this is the only usage).

Have you thought about how to handle the UPSERT SELECT case yet? That's where you'll have the value of one column being set based on the value of a different column. I guess you'll need to check value by value in that case. I wonder if we can determine the precision and scale of a decimal in it's byte[] form? We should only check if the scale/precision of the target is smaller than the scale/precision of the source - that'll help in most cases.