age icon indicating copy to clipboard operation
age copied to clipboard

Increase List Size Limit Beyond 100

Open mohayu22 opened this issue 1 year ago • 4 comments

In Postgres, there is a limitation that prevents more than 100 arguments from being passed to a function. This limitation also applies to lists and maps constructed using the functions agtype_build_list and agtype_build_map. As a result, the size of lists and maps is restricted to a maximum of 100 elements.

SELECT * FROM cypher('test', $$
       RETURN [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
 $$) AS (res agtype);
ERROR:  cannot pass more than 100 arguments to a function

The same restriction applies to map properties.

Why:

  • A user may have a reading list that includes more than 100 books.
  • Neo4j doesn't impose a fixed limit on the number of list items or properties a node can have.

Implementation:

Change agtype_build_list and agtype_build_map to accept one agtype argument instead of VARIADIC "any"

SELECT agtype_build_list('[1, 1, 1]'::agtype);
 agtype_build_list 
-------------------
 [[1, 1, 1]]
(1 row)

Setup: Apache AGE (master) - PostgreSQL 11.18

mohayu22 avatar May 25 '23 13:05 mohayu22

SELECT * FROM cypher('test', $$
       RETURN $1
 $$, '[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]')
 $$) AS (res agtype);

By passing the list as a single string argument, you are able to bypass this limitation since the entire list is treated as a single argument. The cypher function can then reference the list using a positional placeholder like $1. this is a way around to overcome the limitations of an argument as it makes no scene to pass all the argument and yet they are not stored in a list

Amr-Shams avatar May 25 '23 16:05 Amr-Shams

the agtype_build_list function accepts a maximum of 100 arguments. If you try to pass more than 100 arguments to the agtype_build_list function, you will get an error.

You can use the agtype_build_list_from_array function instead that does not have this limitation. You can pass any number of arguments to the agtype_build_list_from_array function and it will return a list with those values.

farooquememon385 avatar May 27 '23 17:05 farooquememon385

the agtype_build_list function accepts a maximum of 100 arguments. If you try to pass more than 100 arguments to the agtype_build_list function, you will get an error.

You can use the agtype_build_list_from_array function instead that does not have this limitation. You can pass any number of arguments to the agtype_build_list_from_array function and it will return a list with those values.

farooquememon385 avatar May 27 '23 17:05 farooquememon385

the agtype_build_list function accepts a maximum of 100 arguments. If you try to pass more than 100 arguments to the agtype_build_list function, you will get an error.

You can use the agtype_build_list_from_array function instead that does not have this limitation. You can pass any number of arguments to the agtype_build_list_from_array function and it will return a list with those values.

@farooquememon385 Can you please give us an example plsease ?

Munmud avatar May 29 '23 01:05 Munmud

Closing this as completed. Fix in PR #1001 .

MuhammadTahaNaveed avatar Jul 20 '23 16:07 MuhammadTahaNaveed