Skip to content

ERROR: unknow type of agtype container 0 #1347

@liuyhs

Description

@liuyhs

Describe the bug
When I tested using age, there were no issues with small data volumes, but once the volume reached a certain point, an error would be reported when executing select.

How are you accessing AGE (Command line, driver, etc.)?
-- psql

What data setup do we need to do?
-- pgsql

CREATE EXTENSION IF NOT EXISTS age;

SET search_path = ag_catalog, "$user", public;


SELECT * FROM ag_catalog.create_graph('cmdb_graph');
CREATE INDEX age_edge_all_gin_idx ON cmdb_graph."_ag_label_edge" USING GIN (properties);


SELECT ag_catalog.create_elabel('cmdb_graph', 'Contain');
SELECT * FROM ag_catalog.ag_label;
CREATE INDEX age_edge_contain_gin_idx ON cmdb_graph."Contain" USING GIN (properties);
CREATE UNIQUE INDEX idx_age_edge_contain_unique_index ON cmdb_graph."Contain"(ag_catalog.agtype_access_operator(properties, '"lid"'::agtype), ag_catalog.agtype_access_operator(properties, '"rid"'::agtype));


SELECT ag_catalog.create_elabel('cmdb_graph', 'Deploy');
SELECT * FROM ag_catalog.ag_label;
CREATE INDEX age_edge_deploy_gin_idx ON cmdb_graph."Deploy" USING GIN (properties);
CREATE UNIQUE INDEX idx_age_edge_deploy_unique_index ON cmdb_graph."Deploy"(ag_catalog.agtype_access_operator(properties, '"lid"'::agtype), ag_catalog.agtype_access_operator(properties, '"rid"'::agtype));





SELECT ag_catalog.create_vlabel('cmdb_graph', 'CVM');
SELECT * FROM ag_catalog.ag_label;

CREATE INDEX gin_idx_cvm_properties ON cmdb_graph."CVM" USING GIN (properties);
CREATE UNIQUE INDEX unique_idx_cvm_id ON cmdb_graph."CVM"(ag_catalog.agtype_access_operator(properties, '"id"'::agtype));

------ generate more data -------
DO
$do$
    BEGIN
        FOR i IN 1..10000 LOOP
            EXECUTE format('
                select * from ag_catalog.cypher(''cmdb_graph'',
                $$
                    CREATE (any_vertex: CVM { `id`: "%s", name: "%s"} )
                    RETURN any_vertex
                $$
            ) as (any_vertex ag_catalog.agtype)',
                   i, (SELECT uuid_in(md5(random()::text || now()::text)::cstring))
                );
        END LOOP;
    END
$do$;

select count(1) from cmdb_graph."CVM" ;


explain analyze
select
    any_profile
from ag_catalog.cypher('cmdb_graph',$$
    MATCH (any_profile:`CVM` { id: '9090' })
    RETURN any_profile
$$
) as (any_profile ag_catalog.agtype);




SELECT ag_catalog.create_vlabel('cmdb_graph', 'CAS_Pool');
SELECT * FROM ag_catalog.ag_label;

CREATE INDEX gin_idx_caspool_properties ON cmdb_graph."CAS_Pool" USING GIN (properties);
CREATE UNIQUE INDEX unique_idx_caspool_id ON cmdb_graph."CAS_Pool"(ag_catalog.agtype_access_operator(properties, '"id"'::agtype));

------ generate more data -------
DO
$do$
    BEGIN
        FOR i IN 10001..30000 LOOP
            EXECUTE format('
                select * from ag_catalog.cypher(''cmdb_graph'',
                $$
                    CREATE (any_vertex: CAS_Pool { `id`: "%s"} )
                    RETURN any_vertex
                $$
            ) as (any_vertex ag_catalog.agtype)',
                  i
                );
        END LOOP;
    END
$do$;

select count(1) from cmdb_graph."CAS_Pool" ;

explain analyze
select
    any_profile
from ag_catalog.cypher('cmdb_graph',$$
    MATCH (any_profile:`CAS_Pool` { id: '1' })
    RETURN any_profile
$$
) as (any_profile ag_catalog.agtype);




------ generate relation -------
DO
$do$
    BEGIN
        FOR i IN 1..10000 LOOP
            EXECUTE format('
                select * from ag_catalog.cypher(''cmdb_graph'',
                $$
                    MATCH (d:CVM {id: "%s"}), (r:CAS_Pool {id: "%s"})
                    CREATE (d)-[:Contain {id: "%s", lid: "%s", rid: "%s", displayName: "连接", isAutoGenerate: "1", ruleId: "%s"}]->(r)
                $$
            ) as (any_vertex ag_catalog.agtype)',
                  i,i+10000,i,i,i+10000, i%100
                );
               
           EXECUTE format('
                select * from ag_catalog.cypher(''cmdb_graph'',
                $$
                    MATCH (d:CVM {id: "%s"}), (r:CAS_Pool {id: "%s"})
                    CREATE (d)-[:Contain {id: "%s", lid: "%s", rid: "%s", displayName: "连接", isAutoGenerate: "1", ruleId: "%s"}]->(r)
                $$
            ) as (any_vertex ag_catalog.agtype)',
                  i,i+20000,i+10000,i,i+20000, i%100
                );    
        END LOOP;
    END
$do$;
select count(1) from cmdb_graph."Contain" ;

--查询一跳关系
explain (analyze) 
SELECT * FROM cypher('cmdb_graph', $$
   MATCH p = (:CVM  {id: '10'})-[]->(a)
    RETURN relationships(p)
$$) as (r agtype);



SELECT ag_catalog.create_vlabel('cmdb_graph', 'CAS_Cluster');
SELECT * FROM ag_catalog.ag_label;

CREATE INDEX gin_idx_cascluster_properties ON cmdb_graph."CAS_Cluster" USING GIN (properties);
CREATE UNIQUE INDEX unique_idx_cascluster_id ON cmdb_graph."CAS_Cluster"(ag_catalog.agtype_access_operator(properties, '"id"'::agtype));

------ generate more data -------
DO
$do$
    BEGIN
        FOR i IN 30001..70000 LOOP
            EXECUTE format('
                select * from ag_catalog.cypher(''cmdb_graph'',
                $$
                    CREATE (any_vertex: CAS_Cluster { `id`: "%s"} )
                    RETURN any_vertex
                $$
            ) as (any_vertex ag_catalog.agtype)',
                  i
                );
        END LOOP;
    END
$do$;

select count(1) from cmdb_graph."CAS_Cluster" ;





------ generate relation -------
DO
$do$
    BEGIN
        FOR i IN 10001..30000 LOOP
            EXECUTE format('
                select * from ag_catalog.cypher(''cmdb_graph'',
                $$
                    MATCH (d:CAS_Pool {id: "%s"}), (r:CAS_Cluster {id: "%s"})
                    CREATE (d)-[:Contain {id: "%s", lid: "%s", rid: "%s", displayName: "连接", isAutoGenerate: "1", ruleId: "%s"}]->(r)
                $$
            ) as (any_vertex ag_catalog.agtype)',
                  i,i+20000,i+20000,i,i+20000, i%100
                );
               
           EXECUTE format('
                select * from ag_catalog.cypher(''cmdb_graph'',
                $$
                    MATCH (d:CAS_Pool {id: "%s"}), (r:CAS_Cluster {id: "%s"})
                    CREATE (d)-[:Contain {id: "%s", lid: "%s", rid: "%s", displayName: "连接", isAutoGenerate: "1", ruleId: "%s"}]->(r)
                $$
            ) as (any_vertex ag_catalog.agtype)',
                  i,i+40000,i+40000,i,i+40000, i%100
                );    
        END LOOP;
    END
$do$;
select count(1) from cmdb_graph."Contain" ;

--查询一跳关系
explain (analyze) 
SELECT * FROM cypher('cmdb_graph', $$
    MATCH p = (:CVM  {id: '10'})-[]->(a)-[]->(b)
    RETURN relationships(p)
$$) as (r agtype);




SELECT ag_catalog.create_vlabel('cmdb_graph', 'CAS_Host');
SELECT * FROM ag_catalog.ag_label;

CREATE INDEX gin_idx_cashost_properties ON cmdb_graph."CAS_Host" USING GIN (properties);
CREATE UNIQUE INDEX unique_idx_cashost_id ON cmdb_graph."CAS_Host"(ag_catalog.agtype_access_operator(properties, '"id"'::agtype));

------ generate more data -------
DO
$do$
    BEGIN
        FOR i IN 70001..150000 LOOP
            EXECUTE format('
                select * from ag_catalog.cypher(''cmdb_graph'',
                $$
                    CREATE (any_vertex: CAS_Host { `id`: "%s"} )
                    RETURN any_vertex
                $$
            ) as (any_vertex ag_catalog.agtype)',
                  i
                );
        END LOOP;
    END
$do$;

select count(1) from cmdb_graph."CAS_Host" ;


------ generate relation -------

create or replace procedure "ag_catalog"."createRelation"() 
as $do$
declare 
    i integer := 1;
BEGIN
    FOR i IN 30001..70000 
    loop
        EXECUTE format('
            select * from ag_catalog.cypher(''cmdb_graph'',
            $$
                MATCH (d:CAS_Cluster {id: "%s"}), (r:CAS_Host {id: "%s"})
                CREATE (d)-[:Contain {id: "%s", lid: "%s", rid: "%s", displayName: "连接", isAutoGenerate: "1", ruleId: "%s"}]->(r)
            $$
        ) as (any_vertex ag_catalog.agtype)',
              i,i+40000,i+40000,i,i+40000, i%100
            );
           
        EXECUTE format('
            select * from ag_catalog.cypher(''cmdb_graph'',
            $$
                MATCH (d:CAS_Cluster {id: "%s"}), (r:CAS_Host {id: "%s"})
                CREATE (d)-[:Contain {id: "%s", lid: "%s", rid: "%s", displayName: "连接", isAutoGenerate: "1", ruleId: "%s"}]->(r)
            $$
        ) as (any_vertex ag_catalog.agtype)',
              i,i+80000,i+80000,i,i+80000, i%100
            );    
           
        commit;       
    END LOOP;
return;   
end $do$ language plpgsql;

call "ag_catalog"."createRelation"() ;







SELECT ag_catalog.create_vlabel('cmdb_graph', 'CAS_VM');
SELECT * FROM ag_catalog.ag_label;

CREATE INDEX gin_idx_casvm_properties ON cmdb_graph."CAS_VM" USING GIN (properties);
CREATE UNIQUE INDEX unique_idx_casvm_id ON cmdb_graph."CAS_VM"(ag_catalog.agtype_access_operator(properties, '"id"'::agtype));

------ generate more data -------
DO
$do$
    BEGIN
        FOR i IN 150001..310000 LOOP
            EXECUTE format('
                select * from ag_catalog.cypher(''cmdb_graph'',
                $$
                    CREATE (any_vertex: CAS_VM { `id`: "%s"} )
                    RETURN any_vertex
                $$
            ) as (any_vertex ag_catalog.agtype)',
                  i
                );
        END LOOP;
    END
$do$;

select count(1) from cmdb_graph."CAS_VM" ;

create or replace procedure "ag_catalog"."createRelation"() 
as $do$
declare 
    i integer := 1;
BEGIN
    FOR i IN 70001..150000 LOOP
        EXECUTE format('
            select * from ag_catalog.cypher(''cmdb_graph'',
            $$
                MATCH (d:CAS_Host {id: "%s"}), (r:CAS_VM {id: "%s"})
                CREATE (d)-[:Contain {id: "%s", lid: "%s", rid: "%s", displayName: "连接", isAutoGenerate: "1", ruleId: "%s"}]->(r)
            $$
        ) as (any_vertex ag_catalog.agtype)',
              i,i+80000,i+80000,i,i+80000, i%100
            );
           
       EXECUTE format('
            select * from ag_catalog.cypher(''cmdb_graph'',
            $$
                MATCH (d:CAS_Host {id: "%s"}), (r:CAS_VM {id: "%s"})
                CREATE (d)-[:Contain {id: "%s", lid: "%s", rid: "%s", displayName: "连接", isAutoGenerate: "1", ruleId: "%s"}]->(r)
            $$
        ) as (any_vertex ag_catalog.agtype)',
              i,i+160000,i+160000,i,i+160000, i%100
            );  
       commit;           
    END LOOP;
return;   
end $do$ language plpgsql;

call "ag_catalog"."createRelation"() ; 



SELECT ag_catalog.create_vlabel('cmdb_graph', 'Server');
SELECT * FROM ag_catalog.ag_label;

CREATE INDEX gin_idx_server_properties ON cmdb_graph."Server" USING GIN (properties);
CREATE UNIQUE INDEX unique_idx_server_id ON cmdb_graph."Server"(ag_catalog.agtype_access_operator(properties, '"id"'::agtype));

------ generate more data -------
DO
$do$
    BEGIN
        FOR i IN 1000001..1010000 LOOP
            EXECUTE format('
                select * from ag_catalog.cypher(''cmdb_graph'',
                $$
                    CREATE (any_vertex: Server { `id`: "%s", name: "%s"} )
                    RETURN any_vertex
                $$
            ) as (any_vertex ag_catalog.agtype)',
                   i, (SELECT uuid_in(md5(random()::text || now()::text)::cstring))
                );
        END LOOP;
    END
$do$;


------ generate relation -------
DO
$do$
    BEGIN
        FOR i IN 1000001..1010000 LOOP
            EXECUTE format('
                select * from ag_catalog.cypher(''cmdb_graph'',
                $$
                    MATCH (d:Server {id: "%s"}), (r:CVM {id: "%s"})
                    CREATE (d)-[:Deploy {id: "%s", lid: "%s", rid: "%s", displayName: "连接", isAutoGenerate: "1", ruleId: "%s"}]->(r)
                $$
            ) as (any_vertex ag_catalog.agtype)',
                  i,i-1000000,i,i,i-1000000, i%100
                );
        END LOOP;
    END
$do$;
DO
$do$
    BEGIN
        FOR i IN 1000001..1010000 LOOP
            EXECUTE format('
                select * from ag_catalog.cypher(''cmdb_graph'',
                $$
                    MATCH (d:CVM {id: "%s"}), (r:Server {id: "%s"})
                    CREATE (d)-[:Deploy {id: "%s", lid: "%s", rid: "%s", displayName: "连接", isAutoGenerate: "1", ruleId: "%s"}]->(r)
                $$
            ) as (any_vertex ag_catalog.agtype)',
                  i-1000000,i,i+10000,i-1000000,i,i%100
                );
        END LOOP;
    END
$do$;
select count(1) from cmdb_graph."Deploy" ;

What is the necessary configuration info needed?

  • [e.g. Installed PostGIS]
  • Installed AGE

What is the command that caused the error?

SELECT * FROM cypher('cmdb_graph', $$
    MATCH p = (:CVM  {id: '10'})-[*2]-()
    unwind nodes(p) as n
      with p, size(collect(distinct n)) as testLength
    where testLength = LENGTH(p) + 1
    RETURN relationships(p)
$$) as (r agtype);
ERROR: unknow type of agtype container 0

Expected behavior
It is necessary to reach a certain amount of data before an error occurs.

Environment (please complete the following information):

  • Version: [e.g. 0.4.0]
  • Version: 1.4.0
  • PG Version: PG14

Additional context
https://www.postgresql.org/message-id/534fca83789c4a378c7de379e9067d4f%40politie.nl

I also found a similar bug on the PostgreSQL official website, which appeared in version 13.2.1. After testing, they have resolved this issue in version 14.5. The link is above.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions