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
sql_gen.py: Col: Convert string table names to Table objects
sql.py: run_query(): Parse "invalid input value at assignment" errors' values as well
sql.py: run_query(): Parse "invalid input value at assignment" errors as FunctionValueExceptions
sql.py: mk_select(): joins: filter_out: Pass NULLs through. Use sql_gen.*2sql_gen() to add the left and right table names to the columns.
sql_gen.py: cond2sql_gen(): Take assume_col param and pass it to value2sql_gen()
sql.py: put_table(): Use table-qualified pkey col names whenever possible, to avoid ambiguous column references
mappings/DwC2-VegBIEN.specimens.csv: placenames: Convert ranks using _toPlacerank to work with multi-inserts
sql.py: DbConn._db(): Fixed bug where the isolation level was not set to "SERIALIZABLE" in a portable way
sql.py: mk_select(): distinct_on is turned off when distinct_on == [] rather than when it's None
schemas/vegbien.sql: Added _toPlacerank
schemas/vegbien.sql: Added _toTaxonrank
sql.py: put_table(): Handle NullValueExceptions by removing invalid rows
sql_gen.py: Added NamedCode
sql_gen.py: Added str() to base classes for debugging
sql.py: mk_select() (and sql_gen.py): Fixed bugs where literal strings were treated as literal values when they should have been treated as column names. Take default_table param to determine default table to use if a column doesn't have an explicit table. put_table(): mk_main_select(): Pass in_tables0 as mk_select()'s default_table.
sql.py: mk_select(): cond(): Run additional sql_gen translation functions cond2sql_gen() and col2sql_gen() on the left and right sides of the comparison
sql_gen.py: ValueCond: Fixed bug where values which are Code objects were being converted to Literals. Added cond2sql_gen().
sql.py: mk_select(): join(): Use cond() now that it supports sql_gen format
sql_gen.py: Added col2sql_gen() and use it in value2sql_gen()
sql_gen.py: CompareCond: By default, compare NULL values literally. Support operator values to pass NULLs through.
strings.py: remove_prefix(), remove_suffix(): Added removed_ref param
sql.py: mk_select(): parse_col(): Use sql_gen.value2sql_gen().to_str()
sql_gen.py: Added as_Table(), unescape_table(), value2sql_gen()
sql.py: mk_select(): Documented conds param
sql.py: mk_select(): cond(): Switched to using sql_gen so that custom conds would be supported
sql_gen.py: ValueCond.to_str(): Made value_code a Code object instead of a string, and renamed it to left_value to reflect where it goes. Added as_ValueCond().
sql.py: esc_value(): Fixed bug where db needed to be referenced through self
sql_gen.py: ValueCond.to_str(): Added value_code param
sql_gen.py: Literal, CompareCond: Implemented to_str(). ValueCond: Autoconvert literal values to Literals.
sql.py: DbConn: Added esc_value()
Moved SQL code generation classes from sql.py to new sql_gen.py. sql_gen.py: Added Code, Literal, ValueCond, and CompareCond. sql.py: Removed Query because we will use a different approach.