Permalink
Browse files

Merge pull request #245 from hason/column_collation

Added support for column collation
  • Loading branch information...
2 parents 3faa3a6 + 87273b2 commit 5b8f4f0382c20feab9a03e453e22666334f36c9d @guilhermeblanco guilhermeblanco committed Feb 11, 2014
Showing with 649 additions and 188 deletions.
  1. +1 −0 docs/en/reference/platforms.rst
  2. +11 −1 lib/Doctrine/DBAL/Platforms/AbstractPlatform.php
  3. +119 −1 lib/Doctrine/DBAL/Platforms/DrizzlePlatform.php
  4. +148 −0 lib/Doctrine/DBAL/Platforms/Keywords/PostgreSQL91Keywords.php
  5. +3 −101 lib/Doctrine/DBAL/Platforms/Keywords/PostgreSQL92Keywords.php
  6. +15 −6 lib/Doctrine/DBAL/Platforms/MySqlPlatform.php
  7. +65 −0 lib/Doctrine/DBAL/Platforms/PostgreSQL91Platform.php
  8. +1 −1 lib/Doctrine/DBAL/Platforms/PostgreSQL92Platform.php
  9. +10 −10 lib/Doctrine/DBAL/Platforms/SQLServerPlatform.php
  10. +8 −0 lib/Doctrine/DBAL/Platforms/SqlitePlatform.php
  11. +35 −43 lib/Doctrine/DBAL/Schema/Comparator.php
  12. +9 −2 lib/Doctrine/DBAL/Schema/DrizzleSchemaManager.php
  13. +10 −2 lib/Doctrine/DBAL/Schema/MySqlSchemaManager.php
  14. +9 −1 lib/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php
  15. +4 −5 lib/Doctrine/DBAL/Schema/SQLServerSchemaManager.php
  16. +30 −0 lib/Doctrine/DBAL/Schema/SqliteSchemaManager.php
  17. +1 −0 lib/Doctrine/DBAL/Tools/Console/Command/ReservedWordsCommand.php
  18. +21 −1 tests/Doctrine/Tests/DBAL/Functional/Schema/DrizzleSchemaManagerTest.php
  19. +19 −0 tests/Doctrine/Tests/DBAL/Functional/Schema/MySqlSchemaManagerTest.php
  20. +9 −9 tests/Doctrine/Tests/DBAL/Functional/Schema/SQLServerSchemaManagerTest.php
  21. +20 −5 tests/Doctrine/Tests/DBAL/Functional/Schema/SqliteSchemaManagerTest.php
  22. +21 −0 tests/Doctrine/Tests/DBAL/Platforms/PostgreSQL91PlatformTest.php
  23. +34 −0 tests/Doctrine/Tests/DBAL/Schema/ComparatorTest.php
  24. +46 −0 tests/Doctrine/Tests/DBAL/Schema/SqliteSchemaManagerTest.php
@@ -53,6 +53,7 @@ PostgreSQL
^^^^^^^^^^
- ``PostgreSqlPlatform`` for all versions.
+- ``PostgreSQL91Platform`` for version 9.1 and above.
- ``PostgreSQL92Platform`` for version 9.2 and above.
SAP Sybase SQL Anywhere
@@ -2317,7 +2317,7 @@ public function getColumnCharsetDeclarationSQL($charset)
*/
public function getColumnCollationDeclarationSQL($collation)
{
- return '';
+ return $this->supportsColumnCollation() ? 'COLLATE ' . $collation : '';
}
/**
@@ -2949,6 +2949,16 @@ public function supportsViews()
}
/**
+ * Does this platform support column collation?
+ *
+ * @return boolean
+ */
+ public function supportsColumnCollation()
+ {
+ return false;
+ }
+
+ /**
* Gets the format string, as accepted by the date() function, that describes
* the format of a stored datetime value of this platform.
*
@@ -231,6 +231,116 @@ public function getDropDatabaseSQL($name)
/**
* {@inheritDoc}
*/
+ protected function _getCreateTableSQL($tableName, array $columns, array $options = array())
+ {
+ $queryFields = $this->getColumnDeclarationListSQL($columns);
+
+ if (isset($options['uniqueConstraints']) && ! empty($options['uniqueConstraints'])) {
+ foreach ($options['uniqueConstraints'] as $index => $definition) {
+ $queryFields .= ', ' . $this->getUniqueConstraintDeclarationSQL($index, $definition);
+ }
+ }
+
+ // add all indexes
+ if (isset($options['indexes']) && ! empty($options['indexes'])) {
+ foreach($options['indexes'] as $index => $definition) {
+ $queryFields .= ', ' . $this->getIndexDeclarationSQL($index, $definition);
+ }
+ }
+
+ // attach all primary keys
+ if (isset($options['primary']) && ! empty($options['primary'])) {
+ $keyColumns = array_unique(array_values($options['primary']));
+ $queryFields .= ', PRIMARY KEY(' . implode(', ', $keyColumns) . ')';
+ }
+
+ $query = 'CREATE ';
+
+ if (!empty($options['temporary'])) {
+ $query .= 'TEMPORARY ';
+ }
+
+ $query .= 'TABLE ' . $tableName . ' (' . $queryFields . ') ';
+ $query .= $this->buildTableOptions($options);
+ $query .= $this->buildPartitionOptions($options);
+
+ $sql[] = $query;
+
+ if (isset($options['foreignKeys'])) {
+ foreach ((array) $options['foreignKeys'] as $definition) {
+ $sql[] = $this->getCreateForeignKeySQL($definition, $tableName);
+ }
+ }
+
+ return $sql;
+ }
+
+ /**
+ * Build SQL for table options
+ *
+ * @param array $options
+ *
+ * @return string
+ */
+ private function buildTableOptions(array $options)
+ {
+ if (isset($options['table_options'])) {
+ return $options['table_options'];
+ }
+
+ $tableOptions = array();
+
+ // Collate
+ if ( ! isset($options['collate'])) {
+ $options['collate'] = 'utf8_unicode_ci';
+ }
+
+ $tableOptions[] = sprintf('COLLATE %s', $options['collate']);
+
+ // Engine
+ if ( ! isset($options['engine'])) {
+ $options['engine'] = 'InnoDB';
+ }
+
+ $tableOptions[] = sprintf('ENGINE = %s', $options['engine']);
+
+ // Auto increment
+ if (isset($options['auto_increment'])) {
+ $tableOptions[] = sprintf('AUTO_INCREMENT = %s', $options['auto_increment']);
+ }
+
+ // Comment
+ if (isset($options['comment'])) {
+ $comment = trim($options['comment'], " '");
+
+ $tableOptions[] = sprintf("COMMENT = '%s' ", str_replace("'", "''", $comment));
+ }
+
+ // Row format
+ if (isset($options['row_format'])) {
+ $tableOptions[] = sprintf('ROW_FORMAT = %s', $options['row_format']);
+ }
+
+ return implode(' ', $tableOptions);
+ }
+
+ /**
+ * Build SQL for partition options.
+ *
+ * @param array $options
+ *
+ * @return string
+ */
+ private function buildPartitionOptions(array $options)
+ {
+ return (isset($options['partition_options']))
+ ? ' ' . $options['partition_options']
+ : '';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public function getListDatabasesSQL()
{
return "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE CATALOG_NAME='LOCAL'";
@@ -264,7 +374,7 @@ public function getListTableColumnsSQL($table, $database = null)
}
return "SELECT COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT, IS_NULLABLE, IS_AUTO_INCREMENT, CHARACTER_MAXIMUM_LENGTH, COLUMN_DEFAULT," .
- " NUMERIC_PRECISION, NUMERIC_SCALE" .
+ " NUMERIC_PRECISION, NUMERIC_SCALE, COLLATION_NAME" .
" FROM DATA_DICTIONARY.COLUMNS" .
" WHERE TABLE_SCHEMA=" . $database . " AND TABLE_NAME = '" . $table . "'";
}
@@ -334,6 +444,14 @@ public function supportsViews()
}
/**
+ * {@inheritdoc}
+ */
+ public function supportsColumnCollation()
+ {
+ return true;
+ }
+
+ /**
* {@inheritDoc}
*/
public function getDropIndexSQL($index, $table=null)
@@ -0,0 +1,148 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license. For more information, see
+ * <http://www.doctrine-project.org>.
+ */
+
+namespace Doctrine\DBAL\Platforms\Keywords;
+
+/**
+ * PostgreSQL 9.1 reserved keywords list.
+ *
+ * @author Martin Hasoň <martin.hason@gmail.com>
+ * @author Steve Müller <st.mueller@dzh-online.de>
+ * @link www.doctrine-project.org
+ * @since 2.5
+ */
+class PostgreSQL91Keywords extends PostgreSQLKeywords
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function getName()
+ {
+ return 'PostgreSQL91';
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @link http://www.postgresql.org/docs/9.1/static/sql-keywords-appendix.html
+ */
+ protected function getKeywords()
+ {
+ return array(
+ 'ALL',
+ 'ANALYSE',
+ 'ANALYZE',
+ 'AND',
+ 'ANY',
+ 'ARRAY',
+ 'AS',
+ 'ASC',
+ 'ASYMMETRIC',
+ 'AUTHORIZATION',
+ 'BINARY',
+ 'BOTH',
+ 'CASE',
+ 'CAST',
+ 'CHECK',
+ 'COLLATE',
+ 'COLUMN',
+ 'CONCURRENTLY',
+ 'CONSTRAINT',
+ 'CREATE',
+ 'CROSS',
+ 'CURRENT_CATALOG',
+ 'CURRENT_DATE',
+ 'CURRENT_ROLE',
+ 'CURRENT_SCHEMA',
+ 'CURRENT_TIME',
+ 'CURRENT_TIMESTAMP',
+ 'CURRENT_USER',
+ 'DEFAULT',
+ 'DEFERRABLE',
+ 'DESC',
+ 'DISTINCT',
+ 'DO',
+ 'ELSE',
+ 'END',
+ 'EXCEPT',
+ 'FALSE',
+ 'FETCH',
+ 'FOR',
+ 'FOREIGN',
+ 'FREEZE',
+ 'FROM',
+ 'FULL',
+ 'GRANT',
+ 'GROUP',
+ 'HAVING',
+ 'ILIKE',
+ 'IN',
+ 'INITIALLY',
+ 'INNER',
+ 'INTERSECT',
+ 'INTO',
+ 'IS',
+ 'ISNULL',
+ 'JOIN',
+ 'LEADING',
+ 'LEFT',
+ 'LIKE',
+ 'LIMIT',
+ 'LOCALTIME',
+ 'LOCALTIMESTAMP',
+ 'NATURAL',
+ 'NOT',
+ 'NOTNULL',
+ 'NULL',
+ 'OFFSET',
+ 'ON',
+ 'ONLY',
+ 'OR',
+ 'ORDER',
+ 'OUTER',
+ 'OVER',
+ 'OVERLAPS',
+ 'PLACING',
+ 'PRIMARY',
+ 'REFERENCES',
+ 'RETURNING',
+ 'RIGHT',
+ 'SELECT',
+ 'SESSION_USER',
+ 'SIMILAR',
+ 'SOME',
+ 'SYMMETRIC',
+ 'TABLE',
+ 'THEN',
+ 'TO',
+ 'TRAILING',
+ 'TRUE',
+ 'UNION',
+ 'UNIQUE',
+ 'USER',
+ 'USING',
+ 'VARIADIC',
+ 'VERBOSE',
+ 'WHEN',
+ 'WHERE',
+ 'WINDOW',
+ 'WITH',
+ );
+ }
+}
Oops, something went wrong. Retry.

0 comments on commit 5b8f4f0

Please sign in to comment.