Skip to content

Possible issue with JSON fields preventing altering tables. #38886

@bx2

Description

@bx2

JSON field added via alteration does not infer types - throws LOGICAL_ERROR. This prevents records to be written after the alteration.

I would expect that I can still insert data into the pre-alteration and post-alteration JSON fields regardless of their schema.

Clickhouse version

SELECT version()

Query id: 061064c4-5cb3-4833-8acb-8ea79709ca93

┌─version()──┐
│ 22.7.1.163 │
└────────────┘

1 row in set. Elapsed: 0.001 sec.

How to reproduce

Create the db:

create database json_tests;

Enable experimental object type:

SET allow_experimental_object_type = 1;

Create the first table:

create table if not exists json_tests.testA
(
    ts DateTime64(0, 'UTC'),
    id UUID,
    data JSON
)
engine = ReplacingMergeTree()
partition by toYYYYMM(ts)
order by (ts, id)
ttl toDateTime(ts) + interval 5 day;

Insert some data:

insert into json_tests.testA format JSONEachRow {"ts": 1657036800, "id": "a2bd6255-6474-42c9-8137-8f83af49754b", "data": {"a": "1", "b": "2", "c": [1,2], "d": {"a": 1}}};

So far so good, now alter:

alter table json_tests.testA
add column metrics JSON
after data;

Insert some data:

insert into json_tests.test format JSONEachRow {"ts": 1657036800, "id": "a2bd6255-6474-42c9-8137-8f83af49754b", "data": {"a": "1", "b": "2", "c": [1,2], "d": {"a": 1}}, "metrics": {"x": 1, "y": {"test": "this"}}};

You will see this error:

Received exception from server (version 22.7.1):
Code: 49. DB::Exception: Received from localhost:9000. DB::Exception: Least common type for object can be deduced only from tuples, but Object('json') given. (LOGICAL_ERROR)

Now, create another table but this time add all the fields upfront, without altering:

create table if not exists json_tests.testB
(
    ts DateTime64(0, 'UTC'),
    id UUID,
    data JSON,
    metrics JSON
)
engine = ReplacingMergeTree()
partition by toYYYYMM(ts)
order by (ts, id)
ttl toDateTime(ts) + interval 5 day;

Insert some data:

insert into json_tests.testB format JSONEachRow {"ts": 1657036800, "id": "a2bd6255-6474-42c9-8137-8f83af49754b", "data": {"a": "1", "b": "2", "c": [1,2], "d": {"a": 1}}, "metrics": {"x": 1, "y": {"test": "this"}}};

This is as expected:

Ok.
1 row in set. Elapsed: 0.006 sec.

I would assume that both methods should yield a success and not a LOGICAL_ERROR.

Metadata

Metadata

Assignees

Labels

experimental featureBug in the feature that should not be used in production

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions