Commit Graph

1568 Commits

Author SHA1 Message Date
Christoph Berg
27b67c6cf6 Add tzdata to build-depends (Closes: #839468) (#483) 2016-11-20 16:58:30 +01:00
Dimitri Fontaine
526fafb4b7 Allow quoting identifiers in db uri tablename.
As shown in #476, it is sometimes needed to be able to quote the
identifier names even when loading from a file, that is when specifying
the target table name in the database uri.

To that ends, allow the option "identifier case" to be used in the file
based cases too. Fixes #476.
2016-11-13 22:14:48 +01:00
Dimitri Fontaine
e5c8b8d159 Fix Advanced Howto for Geolite.
The example was still using a very old syntax for per-field options, and
even the current debian package doesn't support this syntax anymore...
Update the docs to use current syntax.

Fix #475.
2016-11-13 21:54:09 +01:00
Elias Pipping
af46dc280f Use uiop:run-program ... :directory ... (#473) 2016-11-06 22:40:12 +01:00
Dimitri Fontaine
0bd4488d78 Update scripts to reference freetds-devel.
I'm not sure if anyone is using those scripts anymore, but I suppose
keeping them known broken isn't helping anyone either. This is a blind
fix in reaction to latest comment in bug #131.
2016-11-01 21:08:31 +01:00
Dimitri Fontaine
43bb87943f Fix compilation error.
Introduced recently when refactoring the match rules, forgot to update
all call sites, and the bug went unnoticed for a while, oops. Not sure
the fix is all we need to get back a working feature (alter schema
rename to), but it allows to compile and that's all I have the time to
handle today.

See #466.
2016-10-25 11:54:56 +02:00
Dimitri Fontaine
4a431498ca Typo fix... 2016-10-02 20:09:55 +02:00
Dimitri Fontaine
ac91ea97d0 Add iwoca as a sponsor to pgloader.
Thanks guys ;-)
2016-10-02 16:28:43 +02:00
Dimitri Fontaine
d7d36c5766 Review identifier case :quote.
We added some confution about who's responsible to quote the SQL obejct
names in between src/utils/quoting.lisp and src/pgsql/pgsql-ddl.lisp and
as a result some migrations from MySQL with identifier case set to quote
where broken, as in #439.

To fix, remove any use of the format directive ~s in the PostgreSQL ddl
output methods: we consider that the quoting of ~s is to be decided in
apply-identifier-case. We then use ~a instead of ~s.

Fix #439.
2016-09-17 22:45:45 +02:00
Dimitri Fontaine
8fb542bc90 Improve INCLUDING rule matching for MySQL.
In the MySQL source we have explicit support for both string equality
and regexps for the INCLUDING and EXCLUDING clauses. This got broken
when moved to be shared with the ALTER TABLE implementation, because
we were no longer using the type system in the same way in all places.

To fix, create new abstractions for strings and regexps and use those
new structs in the proper way (thanks to defstruct and CLOS).

Fixes #441.
2016-09-10 18:54:11 +02:00
Dimitri Fontaine
5b6adb02b0 Implement and use DROP ... IF EXISTS.
In cases where we have a WITH include drop option, we are generating
lots of SQL DROP statements. We may be running an empty target database
or in other situations where the target object of the DROP command might
not exists. Add support for that case.
2016-09-10 18:01:04 +02:00
Dimitri Fontaine
5ad21bdbfb Add stats about how many files we processed.
In the FILENAME MATCHING case it might be good to have the information,
which can also explain some of the timing spent. The example in
test/bossa.load currently loads data from 296 files total...
2016-09-02 13:39:21 +02:00
Dimitri Fontaine
3569980378 Fix error reporting of catalogs.
The internal catalog representation are deeply recursive in order to
make it easy to traverse the catalog both downwards (catalog to schema
to tables) and upward (table to its schema to its catalog).

In consequence we need to set *print-circles* to non-nil when we're
going to log the catalogs, so turn it to non-nil before generating the
log messages.

While at it, add logging of such catalogs in the :data log verbosity
mode. The catalog output is very verbose, but it's easy to copy/paste it
from a bug report into being a live object we can inspect in the REPL,
thanks to Common Lisp notion of a reader and readable printer!
2016-08-30 23:25:35 +02:00
Dimitri Fontaine
7070f82976 Back to development mode, not a release anymore.
The next version is going to be either 3.3.2 or 3.4.0.50 depending on
whether we have mainly bug fixes or new features.
2016-08-30 23:17:03 +02:00
Dimitri Fontaine
cb30891fbb Release pgloader v3.3.1. 2016-08-28 20:31:31 +02:00
Dimitri Fontaine
f2dcf982d8 Fix stats collections in some cases.
Calling a -with-timing from within a with-stats-collection macro is
redundant and will have the numbers counted twice. Which in this case
didn't happen because the stats label was manually copied, but borked
with a typo in one copy.
2016-08-28 20:29:53 +02:00
Dimitri Fontaine
0b06bc6ad6 Update an old archive test case. 2016-08-28 20:29:30 +02:00
Dimitri Fontaine
9e574ce884 Rename web/ into docs/
This allows to benefit from github pages without having to maintain a
separate orphaned branch.
2016-08-19 20:55:29 +02:00
Dimitri Fontaine
a86a606d55 Improve existing PostgreSQL database handling.
When loading data into an existing PostgreSQL catalog, we DROP the
indexes for better performance of the data loading. Some of the indexes
are UNIQUE or even PRIMARY KEYS, and some FOREIGN KEYS might depend on
them in the PostgreSQL dependency tracking of the catalog.

We used to use the CASCADE option when dropping the indexes, which hides
a bug: if we exclude from the load tables with foreign keys pointing to
tables we target, then we would DROP those foreign keys because of the
CASCADE option, but fail to install them again at the end of the load.

To prevent that from happening, pgloader now query the PostgreSQL
pg_depend system catalog to list the “missing” foreign keys and add them
to our internal catalog representation, from which we know to DROP then
CREATE the SQL object at the proper times.

See #400 as this was an oversight in fixing this issue.
2016-08-10 22:02:06 +02:00
Dimitri Fontaine
43261e0016 Fix double-counting of fkeys in stats reports. 2016-08-08 21:09:15 +02:00
Dimitri Fontaine
53924fab01 Fix foreign key definition formatting.
When we do have a condef (constraint definition in the PostgreSQL
catalog slang), use it rather than trying to invent it again from the
bits and pieces. See #400, which it actually fixes now...
2016-08-08 01:18:36 +02:00
Dimitri Fontaine
210664fff5 Fix typo: Performance, singular.
Fixed #432.
2016-08-07 21:40:28 +02:00
Dimitri Fontaine
ffef9bc28e Improve pgloader bundle distribution.
Include the local git clones in the bundle so that git is not needed at
build time for consumers of the bundle. Fixes #428.
2016-08-07 21:30:48 +02:00
Dimitri Fontaine
c2c98b8b42 Allow any character in a quoted CSV field name.
We used to force overly strict rules for a quoted field name in a CSV
load file, now accept any character but a quote to be part of the field
name.

Fixes #416.
2016-08-07 20:35:37 +02:00
Dimitri Fontaine
70572a2ea7 Implement support for existing target databases.
Also known as the ORM case, it happens that other tools are used to
create the target schema. In that case pgloader job is to fill in the
exiting target tables with the data from the source tables.

We still focus on load speed and pgloader will now DROP the
constraints (Primary Key, Unique, Foreign Keys) and indexes before
running the COPY statements, and re-install the schema it found in the
target database once the data load is done.

This behavior is activated when using the “create no tables” option as
in the following test-case setup:

  with create no tables, include drop, truncate

Fixes #400, for which I got a test-case to play with!
2016-08-06 20:19:15 +02:00
Dimitri Fontaine
2d47c4f0f5 Use internal catalog when loading from files.
Replace the ad-hoc code that was used before in the load from file code
path to use our full internal catalog representation, and adjust APIs to
that end.

The goal is to use catalogs everywhere in the PostgreSQL target API and
allowing to process reason explicitely about source and target catalogs,
see #400 for the main use case.
2016-08-05 11:42:06 +02:00
Dimitri Fontaine
42c8012e94 Cleanup: remove the now unused file! 2016-08-05 11:39:16 +02:00
Dimitri Fontaine
2aedac7037 Improve our internal catalog representation.
First, add index and foreign keys to the list of objects supported by
the shared catalog facility, where is was only found in the pgsql schema
specific package for historical raisons.

Then also add to our catalog internal structures the notion of a trigger
and a stored procedure, allowing for cleaner advanced default values
support in the MySQL cast functions.

Once we now have a proper and complete catalog, review the pgsql module
DDL output function in terms of the catalog and rewrite the schema
creation support so that it takes direct benefit of our internal
catalogs representation.

In passing, clean-up the code organisation of the pgsql target support
module to be easier to work with.

Next step consists of getting rid of src/pgsql/queries.lisp: this
facility should be replaced by the usage of a target catalog that we
fetch the usual way, thanks to the new src/pgsql/pgsql-schema.lisp file
and list-all-* functions.

That will in turn allow for an explicit step of merging the pre-existing
PostgreSQL catalog when it's been created by other tools than pgloader,
that is when migrating with the help of an ORM. See #400 for details.
2016-08-01 23:14:58 +02:00
Dimitri Fontaine
87f6d3a0a0 Clean-up overloaded parse rule for numbers.
The MSSQL index filters parser needs to parse digits and keep them as
text, but was piggybacking on the main parsers and the fixed file format
positions parser by re-using the rule name "number".

My understanding was that by calling `defrule' in different packages one
would create a separate set of rules. It might have been wrong from the
beginning or just changed in newer versions of esrap. Will have to
investigate more.

This fixes #434 while not applying suggested code: the comment about
where to fix the bug is spot on.

Also, it should be noted that the regression tests framework seems to be
failing us and returns success in that error case, despite code
installed to properly handle the situation. This will also need to be
investigated.
2016-07-31 23:54:18 +02:00
Dimitri Fontaine
7daee9405f Fix column names quoting in reset-all-sequences.
The other user-provided names (schema and table) were already quoted
using the quote_ident() PostgreSQL functio, but the column name (attname
in the catalogs) were not.

Blind attempt to fix #425.
2016-06-20 20:52:24 +02:00
Gert Van Gool
3109ba14dc Update bootstrap CentOS scripts (#424)
* Corrects CentOS7 instruction (incorrect group name)

* Update CentOS 6 bootstrap info

- More recent SBCL (1.1 -> 1.3)
- Missing freetds dependency
2016-06-17 23:15:29 +02:00
Krzysztof Jurewicz
fa9f437095 Override encoding in every testing connection (#410)
Also: reuse connection in process-regression-test.

Fix #408.
2016-05-31 23:12:41 +02:00
Krzysztof Jurewicz
1378949eee Fix docs about char and varchar casting in MySQL (#409) 2016-05-18 21:55:36 +02:00
Krzysztof Jurewicz
13f5821547 Add the “set not null” cast option for MySQL (#407)
Use case: Django dissuades setting NULL “on string-based fields […]
because empty string values will always be stored as empty strings, not
as NULL. If a string-based field has null=True, that means it has two
possible values for »no data«: NULL, and the empty string. In most
cases, it’s redundant to have two possible values for »no data«; the
Django convention is to use the empty string, not NULL.”.

pgloader already supports custom transformations which can be used to
replace NULL values in string-based columns with empty strings. Setting
NOT NULL constraint on those columns could possibly be achieved by
running a database query to extract their names and then generating
relevant ALTER TABLE statements, but a cast option in pgloader is a more
convenient way.
2016-05-18 21:50:09 +02:00
Dimitri Fontaine
7344e1d81e Improve docs for FILENAMES MATCHING support.
This format of source file specifications is available for CSV, COPY and
FIXED formats but was only documented for the CSV one. The paragraph is
copy/pasted around in the hope to produce per-format man pages and web
documentation in a fully automated way sometime.

Fix #397.
2016-05-18 11:07:28 +02:00
alex
49c9a2f016 add the postgres debian ppa key in the correct way (#406)
* add the postgres debian ppa key in the correct way

* experimental: remove dist-upgrade

* experimental: install asdf/sbcl via apt
2016-05-16 20:19:55 +02:00
alex
09c178c33b makefile: perform shallow clones when cloning deps (#405) 2016-05-16 20:17:47 +02:00
leonardsson
826d975985 Fix bug in max-parallel-create-index (#398)
Fixes #395
2016-05-05 22:00:38 +02:00
porshkevich
65e08fe187 fix type drop to cascade (#393)
if you have function or operator with  type which is removed, you will have error

error: cannot drop type because other objects depend on it
2016-04-27 21:43:02 +02:00
Dimitri Fontaine
44b9ec81c9 Fix non-deterministic projection in MySQL query.
In MySQL the information_schema.statistics table lists all indexes and
has a row per index column, which means that the index level properties
are duplicated on every row of the view.

Our query against that catalog was lazily assuming the classic and
faulty MySQL behavior where GROUP BY would allow non aggregated columns
to be reported even when the result isn't deterministic, this patch
fixes that by using a trick: the NON_UNIQUE column is 0 for a unique
index and 1 otherwise, so we sum the numbers and process 0 equality.

Fix #345 again.
2016-04-27 21:14:59 +02:00
Dimitri Fontaine
7af6c7ac41 Filter out incomplete foreign key definitions.
It's possible that in MySQL a foreign key constraint definition is
pointing to a non-existing table. In such a case, issue an error message
and refrain from trying to then reinstall the faulty foreign key
definition.

The lack of error handling at this point led to a frozen instance of
pgloader apparently, I think because it could not display the
interactive debugger at the point where the error occurs.

See #328, also #337 that might be fixed here.
2016-04-19 17:23:05 -04:00
Dimitri Fontaine
42e9e521e0 Add option "max parallel create index".
By default, pgloader will start as many parallel CREATE INDEX commands
as the maximum number of indexes you have on any single table that takes
part in the load.

As this number might be so great as to exhaust the target PostgreSQL
server (e.g. maintenance_work_mem), we add an option to limit that to
something reasonnable when the source schema isn't.

Fix #386 in which 150 indexes are found on a single source table.
2016-04-11 17:40:52 +02:00
Dimitri Fontaine
31f8b5c5f0 Set application_name to 'pgloader' by default.
It's always been possible to set application_name to anything really,
making it easier to follow the PostgreSQL queries made by pgloader.
Force that setting to 'pgloader' by default.

Fix #387.
2016-04-11 17:14:38 +02:00
Dimitri Fontaine
0805ee32b8 Add a CCL dockerfile.
For some reasons, with the default DYNSIZE and even when using the 64
bits Clozure-CL variant, I get a series of error messages like the one
below, so that I had to restrain to using 256 MB only:

  Fatal error in "buildapp" : Fault during read of memory address #x7F8C37522668
  Fatal error in "buildapp" : Fault during
  Fatal error in "buildapp" : Stack overflow on temp stack.
  Fatal error in "buildapp" : Fault during read of memory address #x7F8C37522668

It's worth trying something else as the limitation might be tied to my
local virtual build environment.

See #327 where the SBCL Garbage Collector is introducing problems which
might not appear at all when compiling with Clozure-CL instead.
2016-04-08 10:44:04 +02:00
Dimitri Fontaine
6d09de995b Add FusionBox to the sponsor page.
FusionBox bought a Moral License and helped test case pgloader against a
test instance of SQL Server with which it was easy to reproduce bugs.
Those got fixed thanks to their support!
2016-04-02 20:46:16 +02:00
Dimitri Fontaine
c439ea4b9c Explicitely allow for Return as whitespace.
Windows default end of line is #\Return then #\Newline and the parser
gets to see both of them, so it needs to be prepared. See #159 which is
all about windows support.
2016-03-30 10:41:50 +02:00
Dimitri Fontaine
7fc0812f79 Can't reduce an empty list with the max function.
The max function requires at least 1 argument to be given, and in the
case where we have no table to load it then fails badly, as show here:

  CL-USER> (handler-case
               (reduce #'max nil)
             (condition (c)
               (format nil "~a" c)))
  "invalid number of arguments: 0"

Of course Common Lisp comes with a very easy way around that problem:

  CL-USER> (reduce #'max nil :initial-value 0)
  0

Fix #381.
2016-03-29 21:02:31 +02:00
deepy
dcc926e90c Adds cast for image -> bytea 2016-03-29 20:54:27 +02:00
Dimitri Fontaine
177f48863b Fix regression testing.
It's been broken by a recent commit where we did force the internal
table representation to always be an instance of the table structure,
which wasn't yet true for regression testing.

In passing, re-indent a large portion of the function, which accounts
for most of the diff.
2016-03-27 21:28:51 +02:00
Dimitri Fontaine
b1d4e94f2a Fix integer parsing support for SQLite.
The function needs to return a string to be added to the COPY stream, we
still need to make sure whatever given here looks like an integer. Given
the very dynamic nature of data types in SQLite, the integer-to-string
function was already a default now, but failed to be published before in
its fixed version, somehow.
2016-03-27 20:42:40 +02:00