Let's imagine we have a large source table and the function we are going to call has one input schema with as many rows as wanted.
The normal approach would be to use Row_Gen and the source table to control the number of rows in each schema.
Either we use the Row_Gen as the "From" clause for the query root level and the table itself as "From" for the schema, hence calling the function once with all data.
Or vice versa, the source is used as "From" for the query root level and each schema is 1 rows large - the Row_Gen is used as "From" clause.
In order to get a mixture of both we need some way to break the rows into groups and know what row belongs to which group. A gen_row_num() function is one example. We can divide this number by 1000 and take the integer value of that and this will be the group number. So the first 1000 rows are of group 0, for the second 1000 the division will return 1 etc.
As a result we will have 1000 rows in each schema and the root node controlling the number of function calls will have as many rows as there are batches of 1000.