[interchange] Fix error creating indexes in Postgres when QUOTE_IDENTIFIERS is set
Jon Jensen <[email protected]> Tue, 08 Mar 2016 05:00:08 +0000
| Newsgroups | gmane.comp.web.interchange.cvs |
|---|---|
| Message-ID | <[email protected]> |
commit 86fbcb14c402efda89b2329b73270ae513715ddf Author: Jon Jensen <[email protected]> Date: Mon Mar 7 21:18:36 2016 -0700 Fix error creating indexes in Postgres when QUOTE_IDENTIFIERS is set The problem was that Vend::Table::DBI was assembling an index name based on the quoted table name plus '_' plus quoted column name, resulting in a syntactically invalid name like "variants"_"sku", leading to errors like this: DBI: Post creation query 'CREATE INDEX "variants"_"sku" ON "variants" ("sku")' failed: ERROR: syntax error at or near "_" LINE 1: CREATE INDEX "variants"_"sku" ON "variants" ("sku") ^ Instead assemble the name unquoted, and quote the final result. lib/Vend/Table/DBI.pm | 22 ++++++++++++++-------- 1 files changed, 14 insertions(+), 8 deletions(-) --- diff --git a/lib/Vend/Table/DBI.pm b/lib/Vend/Table/DBI.pm index 68f94f6..06b4791 100644 --- a/lib/Vend/Table/DBI.pm +++ b/lib/Vend/Table/DBI.pm @@ -1,8 +1,6 @@ # Vend::Table::DBI - Access a table stored in an DBI/DBD database # -# $Id: DBI.pm,v 2.88 2008-06-30 23:09:53 jon Exp $ -# -# Copyright (C) 2002-2008 Interchange Development Group +# Copyright (C) 2002-2016 Interchange Development Group # Copyright (C) 1996-2002 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify @@ -179,7 +177,7 @@ my %known_capability = ( }, ALTER_INDEX => { mysql => 'CREATE _UNIQUE_ INDEX $TABLE$_$COLUMN$ ON _TABLE_ (_COLUMN_)', - Pg => 'CREATE _UNIQUE_ INDEX $TABLE$_$COLUMN$ ON _TABLE_ (_COLUMN_)', + Pg => 'CREATE _UNIQUE_ INDEX $TABLE_COLUMN$ ON _TABLE_ (_COLUMN_)', default => 'CREATE _UNIQUE_ INDEX $TABLE$_$COLUMN$ ON _TABLE_ (_COLUMN_)', }, LIST_FIELDS_QUERY => { @@ -521,17 +519,25 @@ sub create { my $col = $def; $col =~ s/\W.*//s; $key_index_found = 1 if lc($col) eq lc($key); - my $qcol = $config->{QUOTE_IDENTIFIERS} ? $db->quote_identifier($col) : $col; + + my $qcol = $col; my $qdef = $def; - $qdef =~ s/^\Q$col\E/$qcol/i if $config->{QUOTE_IDENTIFIERS}; + my $qtable_col = "${tablename}_$col"; + if ($config->{QUOTE_IDENTIFIERS}) { + $qcol = $db->quote_identifier($qcol); + $qdef =~ s/^\Q$col\E/$qcol/i; + $qtable_col = $db->quote_identifier($qtable_col); + } + my $template = $config->{ALTER_INDEX} || $known_capability{ALTER_INDEX}{default}; $template =~ s/\b_TABLE_\b/$qtable/g; $template =~ s/\b_COLUMN_\b/$qcol/g; $template =~ s/\b_DEF_\b/$qdef/g; + $template =~ s/\$TABLE_COLUMN\$/$qtable_col/g; $template =~ s/\$TABLE\$/$qtable/g; - $template =~ s/\$DEF\$/$qdef/g; $template =~ s/\$COLUMN\$/$qcol/g; + $template =~ s/\$DEF\$/$qdef/g; $template =~ s/\b_UNIQUE_(\w+_)?/$uniq ? ($1 || $uniq) : ''/eg; push @index, $template; } @@ -564,7 +570,7 @@ sub create { #::logDebug("Running: $_"); $db->do($_) or ::logError( - "DBI: Post creation query '%s' failed: %s" , + "DBI: Index creation query '%s' failed: %s" , $_, $DBI::errstr, );