text: /*
   * Apply constraints managed by partman extension
   */
  CREATE FUNCTION apply_constraints(p_parent_table text, p_child_table text DEFAULT NULL, p_analyze boolean DEFAULT TRUE, p_debug boolean DEFAULT FALSE) RETURNS void
      LANGUAGE plpgsql
      AS $$
  DECLARE
  
  v_child_table                   text;
  v_child_tablename               text;
  v_col                           text;
  v_constraint_cols               text[];
  v_constraint_col_type           text;
  v_constraint_name               text;
  v_datetime_string               text;
  v_existing_constraint_name      text;
  v_job_id                        bigint;
  v_jobmon                        boolean;
  v_jobmon_schema                 text;
  v_last_partition                text;
  v_last_partition_id             int; 
  v_last_partition_timestamp      timestamp;
  v_constraint_values             record;
  v_old_search_path               text;
  v_parent_schema                 text;
  v_parent_tablename              text;
  v_part_interval                 text;
  v_partition_suffix              text;
  v_premake                       int;
  v_sql                           text;
  v_step_id                       bigint;
  v_suffix_position               int;
  v_type                          text;
  
  BEGIN
  
  SELECT type
      , part_interval
      , premake
      , datetime_string
      , last_partition
      , constraint_cols
      , jobmon
  INTO v_type
      , v_part_interval
      , v_premake
      , v_datetime_string
      , v_last_partition
      , v_constraint_cols
      , v_jobmon
  FROM @extschema@.part_config
  WHERE parent_table = p_parent_table;
  
  IF v_constraint_cols IS NULL THEN
      IF p_debug THEN
          RAISE NOTICE 'Given parent table (%) not set up for constraint management (constraint_cols is NULL)', p_parent_table;
      END IF;
      -- Returns silently to allow this function to be simply called by maintenance processes without having to check if config options are set.
      RETURN;
  END IF;
  
  IF v_jobmon THEN
      SELECT nspname INTO v_jobmon_schema FROM pg_catalog.pg_namespace n, pg_catalog.pg_extension e WHERE e.extname = 'pg_jobmon' AND e.extnamespace = n.oid;
      IF v_jobmon_schema IS NOT NULL THEN
          SELECT current_setting('search_path') INTO v_old_search_path;
          EXECUTE 'SELECT set_config(''search_path'',''@extschema@,'||v_jobmon_schema||''',''false'')';
      END IF;
  END IF;
  
  IF v_jobmon_schema IS NOT NULL THEN
      v_job_id := add_job('PARTMAN CREATE CONSTRAINT: '||p_parent_table);
  END IF;
  
  SELECT schemaname, tablename INTO v_parent_schema, v_parent_tablename FROM pg_tables WHERE schemaname ||'.'|| tablename = p_parent_table;
  
  -- If p_child_table is null, figure out the partition that is the one right before the premake value backwards.
  IF p_child_table IS NULL THEN
      
      IF v_jobmon_schema IS NOT NULL THEN
          v_step_id := add_step(v_job_id, 'Automatically determining most recent child on which to apply constraints');
      END IF;
  
      v_suffix_position := (length(v_last_partition) - position('p_' in reverse(v_last_partition))) + 2;
  
      IF v_type IN ('time-static', 'time-dynamic') THEN
          v_last_partition_timestamp := to_timestamp(substring(v_last_partition from v_suffix_position), v_datetime_string);
          v_partition_suffix := to_char(v_last_partition_timestamp - (v_part_interval::interval * ((v_premake * 2)+1) ), v_datetime_string);
      ELSIF v_type IN ('id-static', 'id-dynamic') THEN
          v_last_partition_id := substring(v_last_partition from v_suffix_position)::int;
          v_partition_suffix := (v_last_partition_id - (v_part_interval::int * ((v_premake * 2)+1) ))::text; 
      END IF;
      
      v_child_table := @extschema@.check_name_length(v_parent_tablename, v_parent_schema, v_partition_suffix, TRUE);
  
      IF v_jobmon_schema IS NOT NULL THEN
          PERFORM update_step(v_step_id, 'OK', 'Target child table: '||v_child_table);
      END IF;
  ELSE
      v_child_table := p_child_table;
  END IF;
      
  IF v_jobmon_schema IS NOT NULL THEN
      v_step_id := add_step(v_job_id, 'Checking if target child table exists');
  END IF;
  
  SELECT tablename INTO v_child_tablename FROM pg_catalog.pg_tables WHERE schemaname ||'.'|| tablename = v_child_table;
  IF v_child_tablename IS NULL THEN
      IF v_jobmon_schema IS NOT NULL THEN
          PERFORM update_step(v_step_id, 'NOTICE', 'Target child table ('||v_child_table||') does not exist. Skipping constraint creation.');
          PERFORM close_job(v_job_id);
          EXECUTE 'SELECT set_config(''search_path'','''||v_old_search_path||''',''false'')';
      END IF;
      IF p_debug THEN
          RAISE NOTICE 'Target child table (%) does not exist. Skipping constraint creation.', v_child_table;
      END IF;
      RETURN;
  ELSE
      IF v_jobmon_schema IS NOT NULL THEN
          PERFORM update_step(v_step_id, 'OK', 'Done');
      END IF;
  END IF;
  
  FOREACH v_col IN ARRAY v_constraint_cols
  LOOP
      SELECT c.conname
      INTO v_existing_constraint_name
      FROM pg_catalog.pg_constraint c 
          JOIN pg_catalog.pg_attribute a ON c.conrelid = a.attrelid 
      WHERE conrelid = v_child_table::regclass 
          AND c.conname LIKE 'partmanconstr_%'
          AND c.contype = 'c' 
          AND a.attname = v_col
          AND ARRAY[a.attnum] <@ c.conkey 
          AND a.attisdropped = false;
  
      IF v_jobmon_schema IS NOT NULL THEN
          v_step_id := add_step(v_job_id, 'Applying new constraint on column: '||v_col);
      END IF;
  
      IF v_existing_constraint_name IS NOT NULL THEN
          IF v_jobmon_schema IS NOT NULL THEN
              PERFORM update_step(v_step_id, 'NOTICE', 'Partman managed constraint already exists on this table ('||v_child_table||') and column ('||v_col||'). Skipping creation.');
          END IF;
          RAISE WARNING 'Partman managed constraint already exists on this table (%) and column (%). Skipping creation.', v_child_table, v_col ;
          CONTINUE;
      END IF;
  
      -- Ensure column name gets put on end of constraint name to help avoid naming conflicts 
      v_constraint_name := @extschema@.check_name_length('partmanconstr_'||v_child_tablename, p_suffix := '_'||v_col);
  
      EXECUTE 'SELECT min('||v_col||')::text AS min, max('||v_col||')::text AS max FROM '||v_child_table INTO v_constraint_values;
  
      IF v_constraint_values IS NOT NULL THEN
          v_sql := concat('ALTER TABLE ', v_child_table, ' ADD CONSTRAINT ', v_constraint_name
              , ' CHECK (', v_col, ' >= ', quote_literal(v_constraint_values.min), ' AND '
              , v_col, ' <= ', quote_literal(v_constraint_values.max), ')' );
          IF p_debug THEN
              RAISE NOTICE 'Constraint creation query: %', v_sql;
          END IF;
          EXECUTE v_sql;
  
          IF v_jobmon_schema IS NOT NULL THEN
              PERFORM update_step(v_step_id, 'OK', 'New constraint created: '||v_sql);
          END IF;
      ELSE
          IF p_debug THEN
              RAISE NOTICE 'Given column (%) contains all NULLs. No constraint created', v_col;
          END IF;
          IF v_jobmon_schema IS NOT NULL THEN
              PERFORM update_step(v_step_id, 'NOTICE', 'Given column ('||v_col||') contains all NULLs. No constraint created');
          END IF;
      END IF;
  
  END LOOP;
  
  IF p_analyze THEN
      EXECUTE 'ANALYZE '||p_parent_table;
  END IF;
  
  IF v_jobmon_schema IS NOT NULL THEN
      PERFORM close_job(v_job_id);
      EXECUTE 'SELECT set_config(''search_path'','''||v_old_search_path||''',''false'')';
  END IF;
  
  EXCEPTION
      WHEN OTHERS THEN
          IF v_jobmon_schema IS NOT NULL THEN
              IF v_job_id IS NULL THEN
                  EXECUTE 'SELECT '||v_jobmon_schema||'.add_job(''PARTMAN CREATE CONSTRAINT: '||p_parent_table||''')' INTO v_job_id;
                  EXECUTE 'SELECT '||v_jobmon_schema||'.add_step('||v_job_id||', ''EXCEPTION before job logging started'')' INTO v_step_id;
              ELSIF v_step_id IS NULL THEN
                  EXECUTE 'SELECT '||v_jobmon_schema||'.add_step('||v_job_id||', ''EXCEPTION before first step logged'')' INTO v_step_id;
              END IF;
              EXECUTE 'SELECT '||v_jobmon_schema||'.update_step('||v_step_id||', ''CRITICAL'', ''ERROR: '||coalesce(SQLERRM,'unknown')||''')';
              EXECUTE 'SELECT '||v_jobmon_schema||'.fail_job('||v_job_id||')';
          END IF;
          RAISE EXCEPTION '%', SQLERRM;
  END
  $$;
  
  
  