CREATE OR REPLACE FUNCTION logidze_snapshot(item jsonb, ts_column text DEFAULT NULL, columns text[] DEFAULT NULL, include_columns boolean DEFAULT false) RETURNS jsonb AS $body$

-- version: 3
DECLARE
  ts timestamp with time zone;
  k text;
BEGIN
  item = item - 'log_data';
  IF ts_column IS NULL THEN
    ts := statement_timestamp();
  ELSE
    ts := coalesce((item->>ts_column)::timestamp with time zone, statement_timestamp());
  END IF;

  IF columns IS NOT NULL THEN
    item := logidze_filter_keys(item, columns, include_columns);
  END IF;

  FOR k IN (SELECT key FROM jsonb_each(item))
  LOOP
    IF jsonb_typeof(item->k) = 'object' THEN
       item := jsonb_set(item, ARRAY[k], to_jsonb(item->>k));
    END IF;
  END LOOP;

  return json_build_object(
    'v', 1,
    'h', jsonb_build_array(
            logidze_version(1, item, ts)
          )
    );
END;

$body$ LANGUAGE plpgsql;