   end;
 $BODY$
 LANGUAGE plpgsql VOLATILE;
+
+CREATE OR REPLACE
+FUNCTION array_pop(ar varchar[])
+  RETURNS varchar[] language sql AS $$
+    SELECT ar[array_lower(ar,1) : array_upper(ar,1) - 1];
+$$ IMMUTABLE;
+
+-- remove last item from array
+CREATE OR REPLACE
+FUNCTION array_tail(ar varchar[])
+  RETURNS varchar[] language sql AS $$
+    SELECT ar[2 : array_upper(ar,1)];
+$$ IMMUTABLE;
+
+CREATE OR REPLACE
+FUNCTION array_last(ar varchar[])
+  RETURNS varchar language sql AS $$
+    SELECT ar[array_length(ar,1)];
+$$ IMMUTABLE;
+
+CREATE OR REPLACE
+FUNCTION column_name(name varchar, type varchar)
+  RETURNS varchar language sql AS $$
+    SELECT replace(name, '[x]', '' || type);
+$$  IMMUTABLE;
 
 CREATE TABLE fhir.datatypes (
   version varchar,

      published  TIMESTAMP WITH TIME ZONE NOT NULL,
      data jsonb NOT NULL
    );
    CREATE TABLE "{{tbl_name}}_search_string" (
      _id SERIAL PRIMARY KEY,
      resource_id uuid references "{{tbl_name}}"(logical_id),

      published  TIMESTAMP WITH TIME ZONE NOT NULL,
      data jsonb NOT NULL
    );

    CREATE TABLE "{{tbl_name}}_history" (
      version_id uuid PRIMARY KEY,
      logical_id uuid NOT NULL,
