50 return 'SUBSTR(' . $value .
', ' . $from .
')';
52 return 'SUBSTR(' . $value .
', ' . $from .
', ' . $len .
')';
63 return 'LOCALTIMESTAMP(0)';
87 if ($startPos !==
false) {
89 return 'CASE WHEN (POSITION('.$substr.
' IN '.$str.
') = 0) THEN 0 ELSE (POSITION('.$substr.
' IN '.$str.
') + '.($startPos-1).
') END';
91 return 'POSITION('.$substr.
' IN '.$str.
')';
151 return 'SELECT datname FROM pg_database';
157 c.relname, n.nspname AS schemaname
159 pg_class c, pg_namespace n
160 WHERE relkind = 'S' AND n.oid = c.relnamespace AND
161 (n.nspname NOT LIKE 'pg_%' AND n.nspname != 'information_schema')";
166 return "SELECT tablename AS table_name, schemaname AS schema_name
167 FROM pg_tables WHERE schemaname NOT LIKE 'pg_%' AND schemaname != 'information_schema'";
172 return 'SELECT viewname, definition FROM pg_views';
177 return "SELECT r.conname, pg_catalog.pg_get_constraintdef(r.oid, true) as condef
178 FROM pg_catalog.pg_constraint r
182 FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n
183 WHERE " .$this->getTableWhereClause($table) .
"
184 AND n.oid = c.relnamespace
186 AND r.contype = 'f'";
191 return 'CREATE VIEW ' . $name .
' AS ' . $sql;
196 return 'DROP VIEW '. $name;
207 FROM pg_index, pg_class
208 WHERE pg_class.relname = '$table'
209 AND pg_class.oid = pg_index.indrelid
210 AND (indisunique = 't' OR indisprimary = 't')
222 return "SELECT relname, pg_index.indisunique, pg_index.indisprimary,
223 pg_index.indkey, pg_index.indrelid
224 FROM pg_class, pg_index
227 FROM pg_index si, pg_class sc, pg_namespace sn
228 WHERE " . $this->getTableWhereClause($table,
'sc',
'sn').
" AND sc.oid=si.indrelid AND sc.relnamespace = sn.oid
229 ) AND pg_index.indexrelid = oid";
232 private function getTableWhereClause($table, $classAlias =
'c', $namespaceAlias =
'n')
235 if (strpos($table,
".") !==
false) {
236 list($schema, $table) = explode(
".", $table);
237 $whereClause =
"$classAlias.relname = '" . $table .
"' AND $namespaceAlias.nspname = '" . $schema .
"'";
239 $whereClause =
"$classAlias.relname = '" . $table .
"'";
250 format_type(a.atttypid, a.atttypmod) AS complete_type,
251 (SELECT t1.typname FROM pg_catalog.pg_type t1 WHERE t1.oid = t.typbasetype) AS domain_type,
252 (SELECT format_type(t2.typbasetype, t2.typtypmod) FROM pg_catalog.pg_type t2
253 WHERE t2.typtype = 'd' AND t2.typname = format_type(a.atttypid, a.atttypmod)) AS domain_complete_type,
254 a.attnotnull AS isnotnull,
257 WHERE c.oid = pg_index.indrelid
258 AND pg_index.indkey[0] = a.attnum
259 AND pg_index.indisprimary = 't'
261 (SELECT pg_attrdef.adsrc
263 WHERE c.oid = pg_attrdef.adrelid
264 AND pg_attrdef.adnum=a.attnum
266 FROM pg_attribute a, pg_class c, pg_type t, pg_namespace n
267 WHERE ".$this->getTableWhereClause($table,
'c',
'n') .
"
269 AND a.attrelid = c.oid
270 AND a.atttypid = t.oid
271 AND n.oid = c.relnamespace
285 return 'CREATE DATABASE ' . $name;
297 return 'DROP DATABASE ' . $name;
311 if ($foreignKey->hasOption(
'match')) {
312 $query .=
' MATCH ' . $foreignKey->getOption(
'match');
314 $query .= parent::getAdvancedForeignKeyOptionsSQL($foreignKey);
315 if ($foreignKey->hasOption(
'deferrable') && $foreignKey->getOption(
'deferrable') !==
false) {
316 $query .=
' DEFERRABLE';
318 $query .=
' NOT DEFERRABLE';
320 if ($foreignKey->hasOption(
'feferred') && $foreignKey->getOption(
'feferred') !==
false) {
321 $query .=
' INITIALLY DEFERRED';
323 $query .=
' INITIALLY IMMEDIATE';
344 foreach ($diff->addedColumns as $column) {
346 $sql[] =
'ALTER TABLE ' . $diff->name .
' ' . $query;
349 foreach ($diff->removedColumns as $column) {
350 $query =
'DROP ' . $column->getQuotedName($this);
351 $sql[] =
'ALTER TABLE ' . $diff->name .
' ' . $query;
354 foreach ($diff->changedColumns AS $columnDiff) {
355 $oldColumnName = $columnDiff->oldColumnName;
356 $column = $columnDiff->column;
358 if ($columnDiff->hasChanged(
'type')) {
359 $type = $column->getType();
362 $query =
'ALTER ' . $oldColumnName .
' TYPE ' . $type->getSqlDeclaration($column->toArray(), $this);
363 $sql[] =
'ALTER TABLE ' . $diff->name .
' ' . $query;
365 if ($columnDiff->hasChanged(
'default')) {
367 $sql[] =
'ALTER TABLE ' . $diff->name .
' ' . $query;
369 if ($columnDiff->hasChanged(
'notnull')) {
370 $query =
'ALTER ' . $oldColumnName .
' ' . ($column->getNotNull() ?
'SET' :
'DROP') .
' NOT NULL';
371 $sql[] =
'ALTER TABLE ' . $diff->name .
' ' . $query;
373 if ($columnDiff->hasChanged(
'autoincrement')) {
374 if ($column->getAutoincrement()) {
376 $seqName = $diff->name .
'_' . $oldColumnName .
'_seq';
378 $sql[] =
"CREATE SEQUENCE " . $seqName;
379 $sql[] =
"SELECT setval('" . $seqName .
"', (SELECT MAX(" . $oldColumnName .
") FROM " . $diff->name .
"))";
380 $query =
"ALTER " . $oldColumnName .
" SET DEFAULT nextval('" . $seqName .
"')";
381 $sql[] =
"ALTER TABLE " . $diff->name .
" " . $query;
384 $query =
"ALTER " . $oldColumnName .
" " .
"DROP DEFAULT";
385 $sql[] =
"ALTER TABLE " . $diff->name .
" " . $query;
390 foreach ($diff->renamedColumns as $oldColumnName => $column) {
391 $sql[] =
'ALTER TABLE ' . $diff->name .
' RENAME COLUMN ' . $oldColumnName .
' TO ' . $column->getQuotedName($this);
394 if ($diff->newName !==
false) {
395 $sql[] =
'ALTER TABLE ' . $diff->name .
' RENAME TO ' . $diff->newName;
411 return 'CREATE SEQUENCE ' . $sequence->getQuotedName($this) .
412 ' INCREMENT BY ' . $sequence->getAllocationSize() .
413 ' MINVALUE ' . $sequence->getInitialValue() .
414 ' START ' . $sequence->getInitialValue();
424 if ($sequence instanceof \Doctrine\DBAL\Schema\Sequence) {
425 $sequence = $sequence->getQuotedName($this);
427 return 'DROP SEQUENCE ' . $sequence;
452 if (isset($options[
'primary']) && ! empty($options[
'primary'])) {
453 $keyColumns = array_unique(array_values($options[
'primary']));
454 $queryFields .=
', PRIMARY KEY(' . implode(
', ', $keyColumns) .
')';
457 $query =
'CREATE TABLE ' . $tableName .
' (' . $queryFields .
')';
461 if (isset($options[
'indexes']) && ! empty($options[
'indexes'])) {
462 foreach ($options[
'indexes'] AS $index) {
467 if (isset($options[
'foreignKeys'])) {
468 foreach ((array) $options[
'foreignKeys'] as $definition) {
484 if (is_array($item)) {
485 foreach ($item as $key => $value) {
486 if (is_bool($value) || is_numeric($item)) {
487 $item[$key] = ($value) ?
'true' :
'false';
491 if (is_bool($item) || is_numeric($item)) {
492 $item = ($item) ?
'true' :
'false';
500 return "SELECT NEXTVAL('" . $sequenceName .
"')";
505 return 'SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL '
522 if ( ! empty($field[
'autoincrement'])) {
534 if ( ! empty($field[
'autoincrement'])) {
553 return 'TIMESTAMP(0) WITHOUT TIME ZONE';
561 return 'TIMESTAMP(0) WITH TIME ZONE';
577 return 'TIME(0) WITHOUT TIME ZONE';
596 if ( ! isset($field[
'length'])) {
597 if (array_key_exists(
'default', $field)) {
600 $field[
'length'] =
false;
605 $fixed = (isset($field[
'fixed'])) ? $field[
'fixed'] :
false;
607 return $fixed ? ($length ?
'CHAR(' . $length .
')' :
'CHAR(255)')
608 : ($length ?
'VARCHAR(' . $length .
')' :
'TEXT');
637 return strtolower($column);
642 return 'Y-m-d H:i:sO';
654 return 'INSERT INTO ' . $quotedTableName .
' (' . $quotedIdentifierColumnName .
') VALUES (DEFAULT)';
662 return 'TRUNCATE '.$tableName.
' '.($cascade)?
'CASCADE':
'';
672 $this->doctrineTypeMapping = array(
673 'smallint' =>
'smallint',
674 'int2' =>
'smallint',
675 'serial' =>
'integer',
676 'serial4' =>
'integer',
679 'integer' =>
'integer',
680 'bigserial' =>
'bigint',
681 'serial8' =>
'bigint',
682 'bigint' =>
'bigint',
685 'boolean' =>
'boolean',
687 'varchar' =>
'string',
688 'interval' =>
'string',
689 '_varchar' =>
'string',
691 'bpchar' =>
'string',
693 'datetime' =>
'datetime',
694 'timestamp' =>
'datetime',
695 'timestamptz' =>
'datetimetz',
702 'double precision' =>
'float',
704 'decimal' =>
'decimal',
705 'money' =>
'decimal',
706 'numeric' =>
'decimal',
getSmallIntTypeDeclarationSQL(array $field)
getTimeTypeDeclarationSQL(array $fieldDeclaration)
getAlterTableSQL(TableDiff $diff)
supportsIdentityColumns()
getDropForeignKeySQL($foreignKey, $table)
getLocateExpression($str, $substr, $startPos=false)
getSequenceNextValSQL($sequenceName)
getSetTransactionIsolationSQL($level)
getCreateViewSQL($name, $sql)
getCreateSequenceSQL(\Doctrine\DBAL\Schema\Sequence $sequence)
getListTableConstraintsSQL($table)
_getCommonIntegerTypeDeclarationSQL(array $columnDef)
getDateTimeTzFormatString()
getListTableColumnsSQL($table)
getListTableForeignKeysSQL($table, $database=null)
getDropSequenceSQL($sequence)
getDropDatabaseSQL($name)
getIntegerTypeDeclarationSQL(array $field)
getDateTimeTypeDeclarationSQL(array $fieldDeclaration)
getListSequencesSQL($database)
getBooleanTypeDeclarationSQL(array $field)
getVarcharTypeDeclarationSQL(array $field)
getListViewsSQL($database)
getAdvancedForeignKeyOptionsSQL(\Doctrine\DBAL\Schema\ForeignKeyConstraint $foreignKey)
getDateTimeTzTypeDeclarationSQL(array $fieldDeclaration)
initializeDoctrineTypeMappings()
getDateTypeDeclarationSQL(array $fieldDeclaration)
getSQLResultCasing($column)
getTruncateTableSQL($tableName, $cascade=false)
getCreateDatabaseSQL($name)
getSubstringExpression($value, $from, $len=null)
_getCreateTableSQL($tableName, array $columns, array $options=array())
getEmptyIdentityInsertSQL($quotedTableName, $quotedIdentifierColumnName)
getBigIntTypeDeclarationSQL(array $field)
getClobTypeDeclarationSQL(array $field)
getListTableIndexesSQL($table)