mappings/VegX-VegBIEN.stems.csv: Fixed bug where taxonfit was named taxonFit. (This was only recently discovered because column names are now escaped, causing them not to be case-insensitive.)
sql.py: Added table_not_null_col()
sql.py: Added table_cols() and use it in pkey()
schemas/vegbien.sql, schemas/functions.sql: Relational functions: Added dummy not_null column to provide a column to use in LEFT JOIN filter-out filters
sql.py: mk_insert_select(): embeddable: Use new sql_gen.NamedTable
sql_gen.py: Added NamedTable. Table: Added to_Table().
sql_gen.py: Added section labels for each type of SQL code object
sql.py: put_table(): DuplicateKeyException: Fixed bug where dict_subset_right_join() was used instead of dict_subset(), adding spurious None values for columns in the constraint which are not in the input tables
sql_gen.py: as_Col(): Don't allow None cols
schemas/vegbien.ERD.mwb: Synced with schemas/vegbien.sql
sql.py: Removed no longer used clean_name()
sql.py: mk_insert_select(): embeddable: Removed clean_name() because the function name is now escaped where it's used
sql.py: put_table(): Added support for out_table values that are Table objects
sql.py: mk_insert_select(): Fixed bug where table for creating the returning column Col object was the already-escaped string, instead of the Table object
sql.py: mk_insert_select(): Fixed bug where function name and returning col were not being escaped
sql.py: put_table(): log_ignore(): Fixed bug where in_col needed to be passed through str() because it's a column object
sql.py: put_table(): Fixed bug where the filter_out join should only be used in the insert, not in the select of existing/inserted rows. insert_select() call: Fixed compatibility bug where old versions of Python did not support mixing keyword args and ** args.
sql.py: put_table(): Fixed bug where "add_row_num(db, out_pkeys_ref0)" was mistakenly put under the "if row_ct_ref != None" if statement
sql_gen.py: Renamed NamedCode to NamedCol to better reflect its specific use
sql.py: Removed unnecessary calls to check_name()
sql.py: mk_insert_select(): Fixed bug where returning col was not being escaped
sql.py: add_row_num(): Fixed bug where table name was not being escaped
sql.py: run_query_into(): Fixed bug where into table name was not being escaped
sql.py: mk_insert_select(): Fixed bug where utput column names were not being escaped
sql.py: put_table(): Fixed bug where only string columns were being included in the distinct_on, but columns are now always sql_gen.Col instances
sql.py: put_table(): Put together varying insert_select() args using dict instead of individual vars
sql.py: mk_select(): Fixed bug where order_by needed to default to None if distinct_on was used. Fixed bug where cond values were being treated as %s params in addition to being parsed by sql_gen.as_ValueCond().to_str().
sql_gen.py: Col: Added to_Col()
db_xml.py: put_table(): Accept sql_gen.Table objects or strings instead of separate table and schema names
sql.py: put_table(): Require all in_table_cols to be sql_gen.Col objects
sql_gen.py: ValueCond: Unwrap NamedCode objects
sql_gen.py: NamedCode: Inherit from Col so that its name can be retrieved using the same attribute as Col's
sql.py: put_table(): Debug-log each caught exception
exc.py: str_(): Added first_line_only param to return just the first line
sql.py: ConstraintException: Changed text of message to specify that a constraint was violated
sql.py: Renamed ExceptionWithColumns to ConstraintException and added name field to contain the constraint name, if any
sql.py: put_table(): If there are join_cols, don't get output pkeys of inserted rows and instead select all rows (existing and inserted) after the insert
sql_gen.py: Join.to_str(): Fixed bug where order of right_table_col and left_table_col was reversed when applying as_ValueCond() and as_Col()
sql.py: put_table(): Moved things outside of the try clause which should not produce the exceptions
sql_gen.py: Code: Extend new strings.DebugPrintable instead of implementing str(), repr() itself
strings.py: Added DebugPrintable
sql_gen.py: Code: str(): Added class name. Added repr().
util.py: Added class_name()
sql_gen.py: Join.to_str(): Fixed bug in USING syntax where columns were not escaped
sql.py: put_table(): Order selects by in_tables0's pkey to avoid undefined orderings on multiple runs of the same query
sql.py: mk_select(): Removed no longer used esc_name_()
sql_gen.py: as_Table() Removed no longer used support for (schema, table) tuples
sql_gen.py: Removed no longer used unescape_table() and table2sql_gen()
sql.py: mk_select(): Removed no longer used table_is_esc
sql.py: mk_insert_select(): Removed no longer used table_is_esc
sql.py: pkey(): Removed no longer used table_is_esc
sql.py: cleanup_table(): Switched from table_is_esc to sql_gen.as_Table.to_str()
csv2db: Switched to using plain table names rather than table_is_esc
bin/map: Switched to using sql_gen rather than table_is_esc
sql_gen.py: Removed no longer needed col2sql_gen() and value2sql_gen()
sql.py: Replaced sql_gen.value2sql_gen() with sql_gen.as_Col()
sql.py: Replaced sql_gen.col2sql_gen() with sql_gen.as_Col()
sql.py: mk_select(): Inline cond() and don't use sql_gen.as_Col because sql_gen.as_ValueCond.to_str() calls it
sql_gen.py: Removed no longer needed cond2sql_gen()
sql.py: mk_select(): cond(): Parse conditions using sql_gen-only functions
sql_gen.py: Removed no longer needed join2sql_gen()
sql.py: put_table(): Switched joins to sql_gen.Join objects. mk_select(): Only accept joins which are sql_gen.Join objects.
sql.py: put_table(): Removed no longer used table_is_esc param
sql.py: put_table(): Switched joins to sql_gen.Join objects
sql.py: mk_select(): joins: Switched to using sql_gen.Join.to_str() to render joins to SQL
sql_gen.py: Join.to_str(): Fixed bugs revealed in first test of function
db_xml.py: put_table(): Turn off table_is_esc when calling sql.put_table() and don't escape out_table
sql.py: mk_insert_select(): Use sql_gen.table2sql_gen().to_str() to escape the table
db_xml.py: put_table(): First in_tables table is sql_gen.Table object
db_xml.py: put_table(): Converted row (mapping) values to sql_gen objects
sql.py: mk_select(): Accept main tables (table0's) that are Table objects. This change requires plain SQL code to be wrapped in a CustomCode object if it should not be unescaped and converted to a Table object.
sql_gen.py: as_Table(): Accept tables that are Code objects, not just Table objects
sql_gen.py: CustomCode: Fixed bug where needed to inherit from Code
sql.py: put_table(): Return a sql_gen.Col object instead of an old-style tuple
sql.py: mk_select(): joins: Switched to using filter_out as an attribute of the Join object instead of a sentinel value for the first column. Filter by the right table's pkey being NULL instead of each joined column being NULL, because some joined columns may contain NULL values which would mess things up, but the pkey presumably is NOT NULL.
sql_gen.py: Join.to_str(): Fixed bug where type_ None was being concatenated with the JOIN str
sql_gen.py: Join.to_str(): Fixed bug where USING syntax could not be used for filter_out join type, because a separate right column is required for filtering
sql_gen.py: Use new table2sql_gen() in col2sql_gen(), join2sql_gen()
sql.py: mk_select(): joins: Convert all joins to sql_gen format using join2sql_gen()
sql_gen.py: Added table2sql_gen()
sql_gen.py: Added join2sql_gen()
sql_gen.py: Added as_Col(). as_ValueCond(): Added support for assuming the value is a column rather than a literal value, using the default_table param. Added Join.
sql_gen.py: Put parameterized SQL code objects in separate section
sql.py: put_table(): DuplicateKeyException: Assert that join_cols has changed to avoid infinite loops
sql.py: put_table(): Moved getting pkeys of already existing rows from DuplicateKeyException to try clause, so that it always runs if there are join_cols. DuplicateKeyException: Add new duplicate key cols to join_cols instead of replacing join_cols so that multiple unique constraints being violated causes the union of their columns to be used for join_cols.
sql_gen.py: Added CustomCode
sql.py: mk_select(): joins: Fixed bug where joins dict was being modified without first being copied, causing the input value to be modified
Compare object()-based sentinel values using is. Where sentinel values must be compared using ==, use rand.rand_int() instead.
sql.py: put_table(): Added debug messages for every action performed
sql.py: put_table(): Moved assignment of in_pkeys_ref outside loop so it wouldn't need to be re-versioned every iteration
sql.py: put_table(): Changed temp_suffix to temp_prefix so all temp tables for a given out_table would have the same prefix. (Existing name collisions due to truncated names are not a problem because version prefixes are automatically added.)
mappings/DwC2-VegBIEN.specimens.csv: Filter dates through _toTimestamp
schemas/functions.sql: Added _toTimestamp
mappings/DwC2-VegBIEN.specimens.csv: Filter coordsaccuracy through _toDouble
sql.py: FunctionValueException parsing: Support values containing non-word and non-ASCII characters
exc.py: Support exception messages containing non-ASCII characters
sql.py: put_table(): Print debug messages about how exceptions are being handled
sql.py: put_table(): After getting pkeys of already existing rows, insert new rows
sql.py: put_table(): Handle FunctionValueExceptions by excluding rows with the invalid value in their "value" column
sql.py: run_query(): Also parse "invalid input syntax at assignment" errors as FunctionValueExceptions