我正在研究用户定义的类型,发现你可以这样做:
cqlsh:test> CREATE TYPE ping(time timestamp);
cqlsh:test> CREATE TYPE pong(time timestamp, ping frozen <ping>);
cqlsh:test> ALTER TYPE ping ADD pong frozen <pong>;
cqlsh:test> DESC TYPE ping ;
CREATE TYPE test.ping (
time timestamp,
pong frozen<pong>
);
cqlsh:test> DESC TYPE pong ;
CREATE TYPE test.pong (
time timestamp,
ping frozen<ping>
);
这与任何用例相关吗?
刚刚在研究密切相关的项目时遇到了这个Java 司机票 https://datastax-oss.atlassian.net/browse/JAVA-908.
该架构似乎是递归的,但当您实际尝试插入数据时,这不起作用:
// (using int instead of time for the sake of clarity)
cqlsh:test> create type ping(pingid int);
cqlsh:test> create type pong(pongid int, ping frozen<ping>);
cqlsh:test> alter type ping ADD pong frozen<pong>;
cqlsh:test> create table foo(ping frozen<ping> primary key);
// These are OK:
cqlsh:test> insert into foo(ping) values( {pingid:1} );
cqlsh:test> insert into foo(ping) values(
{ pingid:1,
pong: { pongid:2,
ping: {pingid: 3}}} );
// But notice what happens when you nest one more level:
cqlsh:test> insert into foo(ping) values(
{ pingid:1,
pong: { pongid:2,
ping: {pingid: 3,
pong: {pongid: 4}}}} );
InvalidRequest: code=2200 [Invalid query] message="Unknown field 'pong' in value of user
defined type ping"
看起来像ping
当时使用的pong
被定义的是一个“副本”,没有看到 ALTER 语句的效果。所以我的猜测是不允许递归并且缺少检查。当我得到 Cassandra 开发人员的确认时,我会更新我的答案。
一个有趣的副作用是您不能删除任何一个ping
nor pong
在那之后 :-)
EDIT:这确实是ALTER TYPE
不应该允许。看卡桑德拉-10339 https://issues.apache.org/jira/browse/CASSANDRA-10339.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)