Hi,

Thanks for your replay.

I was starting to suspect something like this, by your description there 
dosen't seam to be a straight forward fix for the issue, if it can be fixed at 
all in a good way.

For me this was a really minor issue, it was just in a test case that I could 
rewrite so I didn't have to recreate the column.

Thanks,
Tommy

On tor, 2019-11-21 at 23:01 -0800, Andrew Prudhomme wrote:
It looks like there are a couple of things going on here. The type check when 
adding a UDT column:

new_type.isValueCompatibleWith(dropped_type)

will only be true if the dropped type is a UDT. This however will never be the 
case, since UDT types are replaced with tuple when converted to a dropped 
column type.

Though re-adding the UDT should be safe, it will not always be safe. Since 
there is currently no way to record a non-frozen tuple, a frozen and non-frozen 
UDT will both produce the same dropped column type (leading to 
CASSANDRA-14673). So it is technically safer to reject the add (though the 
table would already be corrupted and this would keep you from fixing it).

However, there are some inconsistencies. Had this check used the (presumably 
stricter) isCompatibleWith check, it would have passed since it treats both as 
tuple type. Also, you are able to re-add the column as a tuple, which would be 
incompatible with non-frozen UDT data.

On Thu, Nov 21, 2019 at 5:59 AM Tommy Stendahl 
<tommy.stend...@ericsson.com.invalid> wrote:
Hi,

I run in to problem with 3.11.5, I think its related to "* Toughen up column 
drop/recreate type validations (CASSANDRA-15204)"

I have a user defined type and I have a table with a column that has this UDF 
as type, if I drop the column and recreate it with the same name it fails. I 
think this should work, it did in 3.11.4, or I'm I missing something?

I recreated this in cqlsh:

cqlsh> CREATE KEYSPACE foo WITH replication = {'class': 'SimpleStrategy', 
'replication_factor': '1'};
cqlsh> CREATE TYPE foo.my_type (a int, b int );
cqlsh> CREATE TABLE foo.bar ( x int PRIMARY KEY, y int, z frozen<my_type> );
cqlsh> ALTER TABLE foo.bar DROP z ;
cqlsh> ALTER TABLE foo.bar ADD z frozen<my_type>;
InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot 
re-add previously dropped column 'z' of type frozen<my_type>, incompatible with 
previous type frozen<tuple<int, int>>"
cqlsh>

Regards,
Tommy

Reply via email to