Skip to content

INSERT OR REPLACE fails on json columns #390

@ceymard

Description

@ceymard

What happens?

Using INSERT OR REPLACE with a json column in duckdb to a json column in postgres fails.

Which would be I guess because when creating the udpate table, it somehow creates col as VARCHAR and not JSON, which would be, if I had to guess, because src/postgres_utils.cpp function PostgresUtils::TypeToString replies VARCHAR for json.

Which leads me to ask ; why does this extension pass through an update table ? Why doesn't it use the ON CONFLICT clause on an identified primary key or unique column, failing if it doesn't detect any ?

To Reproduce

In postgres

CREATE TABLE test_pg(
   id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
  col JSON
);

In duckdb

CREATE TABLE test_ddb(id bigint, col JSON);
INSERT INTO test_ddb values (1, '{"A": 1}');

Then try to uses OR REPLACE

ATTACH ... AS pg (type postgres);
INSERT OR REPLACE into pg.public.test_pg by name select * from test_ddb;

Which leads to :

Failed to execute query "UPDATE "public"."test_pg" SET "col" = "update_data_fce5d0da-c0e4-4936-bd74-2b66a3fc0e93"."col" FROM "update_data_fce5d0da-c0e4-4936-bd74-2b66a3fc0e93" WHERE "test_pg".ctid=__page_id_string::TID": ERROR:  column "col" is of type json but expression is of type character varying

OS:

linux

PostgreSQL Version:

17

DuckDB Version:

latest

DuckDB Client:

latest

Full Name:

Christophe Eymard

Affiliation:

Salesway

Have you tried this on the latest main branch?

  • I agree

Have you tried the steps to reproduce? Do they include all relevant data and configuration? Does the issue you report still appear there?

  • I agree

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions