DO $$
DECLARE
  u   collection('text');
BEGIN
  RAISE NOTICE 'Iteration test 1';
  u['aaa'] := 'Hello World';
  u['bbb'] := 'Hello All';
  u['ccc'] := 'Hi';

  RAISE NOTICE 'value: %', value(u);

  u := next(u);
  RAISE NOTICE 'value: %', value(u);
END
$$;

DO $$
DECLARE
  u   collection('text');
BEGIN
  RAISE NOTICE 'Iteration test 3';
  u['aaa'] := 'Hello World';
  u['bbb'] := 'Hello All';
  u['ccc'] := 'Hi';

  u := next(u);
  u := next(u);
  u := prev(u);
  RAISE NOTICE 'value: %', value(u);
END
$$;

DO $$
DECLARE
  u   collection('text');
BEGIN
  RAISE NOTICE 'Iteration test 4';
  u['aaa'] := 'Hello World';
  u['bbb'] := 'Hello All';
  u['ccc'] := 'Hi';

  u := next(u);
  u := next(u);
  u := first(u);
  RAISE NOTICE 'value: %', value(u);
END
$$;

DO $$
DECLARE
  u   collection('text');
BEGIN
  RAISE NOTICE 'Iteration test 5';
  u['aaa'] := 'Hello World';

  RAISE NOTICE 'isnull: %', isnull(u);
  u := next(u);
  RAISE NOTICE 'isnull: %', isnull(u);
END
$$;

DO $$
DECLARE
  u   collection('text');
BEGIN
  RAISE NOTICE 'Iteration test 6';
  u['aaa'] := 'Hello World';
  u['bbb'] := 'Hello All';
  u['ccc'] := 'Hi';

  u := first(u);
  WHILE NOT isnull(u) LOOP
    RAISE NOTICE 'value: %', value(u);
    u := next(u);
  END LOOP;
END
$$;

DO $$
DECLARE
  u   collection('text');
BEGIN
  RAISE NOTICE 'Iteration test 7';
  u['aaa'] := 'Hello World';
  u['bbb'] := 'Hello All';
  u['ccc'] := 'Hi';

  u := first(u);
  WHILE NOT isnull(u) LOOP
    RAISE NOTICE 'value: %', value(u);
    u := next(u);
  END LOOP;

  RAISE NOTICE 'value: %', u['bbb'];
END
$$;

DO $$
DECLARE
  u   collection('text');
BEGIN
  RAISE NOTICE 'Iteration test 8';
  u['aaa'] := 'Hello World';
  u['bbb'] := 'Hello All';
  u['ccc'] := 'Hi';

  u := delete(u, 'bbb');

  u := first(u);
  WHILE NOT isnull(u) LOOP
    RAISE NOTICE 'value: %', value(u);
    u := next(u);
  END LOOP;
END
$$;

DO $$
DECLARE
  u   collection('text');
BEGIN
  RAISE NOTICE 'Iteration test 9';
  u['aaa'] := 'Hello World';
  u['bbb'] := 'Hello All';
  u['ccc'] := 'Hi';

  u := delete(u, 'aaa');

  u := first(u);
  WHILE NOT isnull(u) LOOP
    RAISE NOTICE 'value: %', value(u);
    u := next(u);
  END LOOP;
END
$$;

DO $$
DECLARE
  u   collection('text');
  t   text;
BEGIN
  RAISE NOTICE 'Iteration test 10';
  u['ccc'] := '3';
  u['bbb'] := '2';
  u['eee'] := '5';
  u['ddd'] := '4';
  u['aaa'] := '1';

  u := sort(u);
  WHILE NOT isnull(u) LOOP
    RAISE NOTICE 'value: %', value(u);
    u := next(u);
  END LOOP;
END
$$;

DO $$
DECLARE
  u   collection('text');
BEGIN
  RAISE NOTICE 'Iteration test 11';
  u['aaa'] := 'Hello World';
  u['bbb'] := 'Hello All';

  u := next(u);
  RAISE NOTICE 'value: %', value(u);
  u := next(u);
  RAISE NOTICE 'value: %', value(u);
  u := next(u);
  RAISE NOTICE 'value: %', value(u);
END
$$;

DO $$
DECLARE
  u   collection('text');
BEGIN
  RAISE NOTICE 'Iteration test 12';

  u := first(u);
  RAISE NOTICE 'value: %', value(u);
  u := next(u);
  RAISE NOTICE 'value: %', value(u);
END
$$;

DO $$
DECLARE
  u   collection('text');
BEGIN
  RAISE NOTICE 'Iteration test 13';

  u := prev(u);
  RAISE NOTICE 'value: %', value(u);
END
$$;

DO $$
DECLARE
  u   collection('text');
BEGIN
  RAISE NOTICE 'Iteration test 14';
  u['aaa'] := 'Hello World';
  u['bbb'] := 'Hello All';
  u['ccc'] := 'Hi';

  u := next(u);
  u := next(u);
  RAISE NOTICE 'find after next: %', find(u, 'aaa');
END
$$;

DO $$
DECLARE
  u   collection COLLATE "en_US";
  v   collection COLLATE "C";
BEGIN
  RAISE NOTICE 'Iteration test 15';
  u['a'] := '1'::text;
  u['B'] := '2'::text;
  u['c'] := '3'::text;
  v := copy(u);

  u := sort(u);
  WHILE NOT isnull(u) LOOP
    RAISE NOTICE 'u value: %', value(u);
    u := next(u);
  END LOOP;

  v := sort(v);
  WHILE NOT isnull(v) LOOP
    RAISE NOTICE 'v value: %', value(v);
    v := next(v);
  END LOOP;
END
$$;

DO $$
DECLARE
  u   collection('text');
BEGIN
  RAISE NOTICE 'Iteration test 16';
  u['aaa'] := 'Hello World';

  u := first(u);
  u := prev(u);
  RAISE NOTICE 'value: %', value(u);
END
$$;