fix: inputs/.TNRS/schema.sql: taxon_match: added derived column "Accepted_family__@TNRS__@vegpath.org", which is needed because "*Accepted_name_family" isn't always populated
bugfix: inputs/.TNRS/schema.sql: taxon_match: to add columns in the middle: also need to run util.derived_cols_repopulate() since the dependency order has changed
fix: schemas/util.sql: derived_cols_populate(): documented that this function will sometimes not repopulate columns when needed, such as after changing the column order. in these cases, it is necessary to run util.derived_cols_repopulate() manually.
schemas/util.sql: derived_cols_populate(): use new derived_cols_repopulate()
schemas/util.sql: added derived_cols_repopulate()
fix: inputs/.TNRS/schema.sql: taxon_match: COMMENT: to add columns in the middle: also need to run util.derived_cols_update()
fix: inputs/.TNRS/schema.sql: taxon_match: COMMENT: updated util.derived_cols_sync() to util.derived_cols_update()
inputs/.TNRS/schema.sql: reordered derived columns in dependency order
bugfix: schemas/util.sql: derived_cols_trigger_update(): need to clear derived cols first so old values won't be used in calculations
inputs/.TNRS/schema.sql: derived_cols_trigger_update(): put expr on same line as var, to save space
inputs/.TNRS/schema.sql: derived_cols_trigger_update(): removed lines between statements, which add too much space
fix: schemas/util.sql: derived_cols_trigger_update(): don't indent expr because may have multiple lines
bugfix: schemas/util.sql: derived_col_update(): set_comment(): vars can't have same name as params, which will be substituted
inputs/.TNRS/schema.sql: taxon_match: added derived column "[accepted_]morphospecies[_binomial]__@Brad__.TNRS@vegpath.org"
inputs/.TNRS/schema.sql: taxon_match: added derived column "[parsed_]morphospecies[_suffix]__@Brad__.morphosp@vegpath.org"
schemas/public_.sql: analytical_stem: synced to analytical_stem_view
bugfix: schemas/util.sql: view_body(): need to match view defs without trailing \n
bugfix: schemas/util.sql: view_body(): need to support both CREATE statements and view bodies
bugfix: schemas/util.sql: raise(): use eval_raw() so that functions called by eval() (such as view_def_to_orig()) can use raise() for debugging
schemas/util.sql: eval(): use new eval_raw()
schemas/util.sql: added eval_raw()
bugfix: schemas/util.sql: view_is_automatically_updatable(), view_is_subset(): use util.view_body() so not matching COMMENT statements, etc
schemas/util.sql: added view_body()
bugfix: schemas/util.sql: view_is_subset(): need to support "(x)" in col name
schemas/util.sql: added copy_struct(from_ regtype, to_ text) and copy_data(from_ regtype, to_ text), and use these in a general-purpose copy()
inputs/.TNRS/schema.sql: added new derived columns to derived views
fix: schemas/util.sql: derived_col_update(): column comment: formula: put on own line to support multiline exprs
bugfix: schemas/util.sql: derived_col_update(): column comment: need to use expr from DB, not as provided by user, to avoid this changing when derived_col_update() is rerun
inputs/.TNRS/schema.sql: taxon_match: added derived columns scrubbed_*
bugfix: schemas/util.sql: derived_col_expr_from_check_constraint(): need to handle strs with \n after IS DISTINCT FROM
inputs/.TNRS/schema.sql: taxon_match: put matched-taxon derived columns before accepted-taxon derived columns
inputs/.TNRS/schema.sql: taxon_match: added derived column "[matched_]species[_binomial]~(Accepted_)__@TNRS__@vegpath.org"
inputs/.TNRS/schema.sql: _matched_has_accepted: renamed to matched_has_accepted because the leading _ did not create vertical alignment anyway, due to different quoting syntaxes
schemas/util.sql: added derived_col_name_from_check_constraint()
schemas/util.sql: derived_col_update(): add steps to rename column
bugfix: schemas/util.sql: derived_col_update(): don't set_comment() until CHECK constraint exists so that we can use its canon-ed formula
bugfix: schemas/util.sql: check_constraint_expr_enable(): don't remove suffix without also removing prefix. this is done by using extract_by_regexp() instead. also changed check_constraint_enabled() to use regexps to match this.
bugfix: schemas/util.sql: extract_by_regexp(): needs surrounding COALESCE in case no match
schemas/util.sql: added extract_by_regexp()
inputs/.TNRS/schema.sql: taxon_match: added derived column _matched_has_accepted
inputs/.TNRS/schema.sql: taxon_match: added derived columns "[matched_]scientificName[_with_author]__@DwC__@vegpath.org", "[accepted_]scientificName[_with_author]__@DwC__@vegpath.org"
inputs/.TNRS/schema.sql: taxon_match: added derived columns "[accepted_]Infraspecific_rank[_abbr]__@TNRS__@vegpath.org", "[accepted_]infraspecificEpithet__@DwC__@vegpath.org"
inputs/.TNRS/schema.sql: taxon_match: added derived column "__accepted_infraspecific_{rank,epithet}"
inputs/.TNRS/schema.sql: taxon_match: added derived column __accepted_infraspecific_label
bugfix: schemas/util.sql: canon_sql(): need to use the right search_path
bugfix: schemas/util.sql: check_constraint view: def: must use our wrapper so that the right search_path is used
schemas/util.sql: added pg_get_expr() wrapper, which sets search_path to pg_temp
bugfix: schemas/util.sql: check_constraint_expr_*(): updated strings for new Mac Postgres update, which was installed on reboot
bugfix: schemas/util.sql: derived_col_update(): steps to modify: also need to run util.derived_cols_populate()
inputs/.TNRS/schema.sql: taxon_match: added derived columns "[accepted_]genus__@DwC__@vegpath.org", "[accepted_]specificEpithet__@DwC__@vegpath.org"
bugfix: schemas/util.sql: check_constraint view: can't use consrc because this doesn't get auto-updated with column renames
bugfix: schemas/util.sql: derived_col_constraints_enable(): need final `SELECT NULL::void` so don't fold away functions called in previous query
inputs/.TNRS/schema.sql: taxon_match: ran derived_cols_update()
bugfix: derived_col_constraint_initially_enabled(): must be both already enabled and unchanged to be initially enabled (r14240 was only partially correct)
schemas/util.sql: derived_cols_trigger_update(): to regenerate instructions: use util.derived_cols_update(), which also performs other updates
schemas/util.sql: derived_cols_sync(): renamed to derived_cols_trigger_update() for clarity
schemas/util.sql: added derived_cols_update()
schemas/util.sql: derived_col_update(): add comment describing how to modify derived column
schemas/util.sql: added quote_typed(derived_col_def)
schemas/util.sql: added quote_typed(col)
schemas/util.sql: derived_cols_sync(): table__fill_derived(): document in the function comment how to regenerate it
schemas/util.sql: added mk_set_comment(regprocedure, text)
schemas/util.sql: set_comment(): accept anything with a mk_set_comment()
fix: schemas/util.sql: check_constraint_expr_disable(): need to use CASE instead of `true OR ` because OR always evaluates both sides, slowing down constraint evaluation
fix: schemas/util.sql: check_constraint view: conrelid: don't cast to regclass so can use index scan
bugfix: derived_col_constraint_initially_enabled(): use whether existing constraint is already enabled, not whether expr is unchanged (which does not affect the enabled status)
schemas/util.sql: check_constraint_canon_sql(): use util.debug_print_return_value() to assist debugging
bugfix: schemas/util.sql: check_constraint_replace(): need to use util.check_constraint_canon_sql() instead of util.canon_sql()
schemas/util.sql: added check_constraint_canon_sql(). this must be used instead of plain util.canon_sql() because unlike queries, CHECK constraints are not simplified, just standardized.
schemas/util.sql: check_constraint_replace(): support not canon-ing def.expr
bugfix: schemas/util.sql: CHECK constraint exprs: need to remove the enclosing () to be consistent everywhere
bugfix: schemas/util.sql: canon_sql(): need to include the enclosing () because the DB includes them
fix: schemas/util.sql: canon_sql(): use explain()'s verbose mode to facilitate debugging
bugfix: schemas/util.sql: explain(): need to restore NOTICEs in verbose mode
schemas/util.sql: explain(): support running in verbose mode
bugfix: schemas/util.sql: check_constraint_replace(): need to canon the expr, using new util.canon_sql(), so it can be compared with the expr in the DB
schemas/util.sql: added canon_sql(expr text, table_ regclass)
fix: schemas/util.sql: check_constraint view: don't use pretty-print mode, because this format does not match util.canon_sql()
fix: schemas/util.sql: check_constraint_expr_enable(), derived_col_expr_from_check_constraint(): trim parens in order to support non-pretty-print mode, which is needed with canon_sql()
schemas/util.sql: added canon_sql(expr text)
schemas/util.sql: added trim_parens()
bugfix: schemas/util.sql: copy(from_ regtype, to_ text): must be declared STRICT to handle NULL properly
schemas/util.sql: added copy(from_ regtype, to_ text)
fix: schemas/util.sql: is_raise_condition(): should be called is_log_level()
schemas/util.sql: raise(): support SQLSTATE values
bugfix: schemas/util.sql: raise_expr(raise_type): only treat as raise condition if not SQLSTATE, to allow custom SQLSTATEs
schemas/util.sql: added raise_expr(raise_type)
schemas/util.sql: added is_raise_condition()
schemas/util.sql: added is_sqlstate()
schemas/util.sql: typeof(expr text, table_ regtype): use simpler util.eval2val() instead of EXECUTE
fix: schemas/util.sql: derived_col_constraint_initially_enabled(): also should be initially enabled if expr unchanged, to avoid re-running constraint on all rows
schemas/util.sql: derived_col_update(): use new util.derived_col_constraint_initially_enabled()
schemas/util.sql: added derived_col_constraint_initially_enabled()
schemas/util.sql: added derived_col_expr(col)
derived_col_constraint_enable(): documented that this now avoids re-running constraint on all rows if already enabled