When objects referenced by constraints (indexes or other constraints) change, the constraint itself doesn't update it's last_change date. This can lead to dangling references after refreshing the cache. We look up the referenced objects and use the most recent change date between the constraint and the referenced object so that the constraint itself will get updated when the referenced object changes.
Allow absolute paths in includes.
Fixed a bug in the ParseError message.
Sometimes objects will change their type after being put in a hash (yes I know this is evil...) so we will use the namespace type instead of the current type, so that it's more likely that the hash won't change over time.
Compare the equality of two foreign key constraints based on the columns they reference, rather than the constraint referenced itself, as the name may vary, but that shouldn't matter to the FK.
Validate the cached schema after loading/refreshing the cache.
Previously we only validated it right after saving the cache, so
an invalid schema would be loaded from the cache without complaint.
Now it always notifies the user if the schema is not valid and won't
proceed until it is.
A more general approach to dealing with dangling references in the cache.

In a previous commit, I tackled the need to refresh objects who referenced other
objects, but their own timestamp hasn't changed. This new approach eliminates
the need to explicitly find the latest timestamp, and instead invalidates and
refereshes all objects that reference an object that is actually changed in the
DB as indicated by it's change date. This extra invalidation only goes one level
deep in the dependency graph, so excessive refreshes are avoided. As a bonus,
some previous code was explititly handling the fact that we refresh all Columns
any time a Table changes, and now this process handles that too.
Really truncate PL/SQL changes, so we don't have to see HUGE diffs.
PL/SQL compile directives can have double $ when referring to compiler flags.
When dealing with PlsqlCode objects during cache refresh, check they actually exist in the schema before trying to reference them.
Fix nulls in data where null isn't all uppercase. Also handle the empty string as null.
This message was coming up when the cache didn't exist. I found it misleading, so I just removed it.
When merging the properties of a deferred object with the real one, try not to overwrite properties already set on the deferred object if no meaningful property has been set on the real object. It's possible that both objects will have the same property set to different values, in which case there is the new error PropertyConflict.
Apparently a PL/SQL Body can exist without any header. It's necessarily in an errored state, but Precog should handle this anyways and help clean up the mess, rather than messing itself. The solution is to have either the header or the body look for the other without getting a deferred object, therefore no unsatisfiable deferred objects will be created, and the second object to be created will guarantee the two get properly linked in dependency.
Don't complain about a HasExpression not having an expression if the object is deferred.
Column names in the qualified_col_name property were conflicting because when created deferred, we don't know if the name is a generated one yet. So we check for equality a little differently here.
Add TODO file.
Invalidating objects when files changed was slow. I was doing a set difference using a list. ಠ_ಠ Now it's fast.
Merge branch 'extern_tables'
Fixed bug where grants were being granted to the object's owner, not the grantee.