This issue is part of #2157455: [Meta] Make Drupal 8 work with PostgreSQL or remove support from core before release.

Problem/Motivation

Some migrate tables use reserved keywords as column name like OFFSET currently causing exceptions on PostgreSQL because such names need quoting to work. As this is somehow not a problem for MySQL we decided to add support for PostgreSQL also by adding quotes where needed.

Proposed resolution

  • Add new reserved words for PostgreSQL 9.1.2 and other versions.
  • Ensure quoting for column names on insert/update/delete for reserved words.
  • Add tests to ensure quoting for column names.

Remaining tasks

Write Patch
Patch review
Run tests on PostgreSQL test bot
Write beta evaluation

User interface changes

None.

API changes

None.

Beta phase evaluation

Reference: https://www.drupal.org/core/beta-changes
Issue category Bug because migrate system uses reserved words and render migrate unusable on PostgreSQL.
Issue priority Major because it affects secondary environments and the migrate component is not required for new Drupal 8 web sites.
Prioritized changes PostgreSQL until 2015.07.01

Comments

bzrudi71’s picture

Status: Active » Needs review
StatusFileSize
new109.15 KB
amateescu’s picture

Note that you will also have to update core/modules/migrate_drupal/src/Tests/d6.gz following the procedure detailed in core/scripts/migrate-dump-d6.sh, see #2454669-10: SQLite: Fix tests in migrate_drupal test group and #2452709-4: migrate_drupal test dump generation documentation.

bzrudi71’s picture

Issue summary: View changes

Oh no, really? That seems like a time consuming thing to me from the documentation and in addition I have no working MySQL setup ;-) Updated IS to reflect that...

amateescu’s picture

Yep, it's quite cumbersome and time consuming :/ But at least there's a plan to improve it: #2469623: Process for creating migration source DBs for automated tests

mradcliffe’s picture

Component: postgresql db driver » migration system

Visibility.

bzrudi71’s picture

#2469623: Process for creating migration source DBs for automated tests just landed. That should make it much easier to create the required d6 dump file. So someone with MySQL setup out there doing this part PLEASE? :) With this one in and #2477845: PostgreSQL: Fix broken migrate table creation, we are close to 100% migrate_drupal tests passing!

erik.erskine’s picture

@bzrudi is the d6 dump file still needed?

bzrudi71’s picture

@ingaro, not sure as I didn't follow the latest development in #2469623: Process for creating migration source DBs for automated tests ;) I just know it was planned and not sure if this is already covered by this patch. However, we need at least a patch against the generated EventTimezones table file, as this fails as discovered by the new MigrateTableDumpTest :)

erik.erskine’s picture

StatusFileSize
new1.42 KB

Is renaming the column the right approach? Just been having a look at the event contrib module, which defines the event_timezones table. It does contain a column called offset, which is allowed by PostgreSQL but requires surrounding with quotes.

See event.install:

  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      db_query("CREATE TABLE {event_timezones} (
                timezone int NOT NULL default '0',
                name varchar(255) NOT NULL default '',
                offset TIME NOT NULL default '0',
                offset_dst TIME NOT NULL default '0',
                dst_region int NOT NULL default '0',
                is_dst int NOT NULL default '0',
                PRIMARY KEY (timezone)
                ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
      break;
    case 'pgsql':
      db_query("CREATE TABLE {event_timezones} (
                timezone integer NOT NULL default '0',
                name varchar(255) NOT NULL default '',
                \"offset\" interval NOT NULL default '0 seconds',
                offset_dst interval NOT NULL default '0 seconds',
                dst_region integer NOT NULL default '0',
                is_dst integer NOT NULL default '0',
                PRIMARY KEY (timezone)
                ) ");
      break;
  }

The tests aren't failing when the table is created, because the createTableSql function in Drupal\Core\Database\Driver\pgsql\Schema escapes the column name with "". However the Drupal\Core\Database\Driver\pgsql\Insert class does not do this, and perhaps it should. If reserved column names are supported then the PG driver seems like the right place to escape them.

Attached patch illustrates what I mean (and fixes various test failures), but I imagine needs some more work as there may well be other instances of this happening (DELETE, UPDATE etc).

Please note it also only works with #2477845: PostgreSQL: Fix broken migrate table creation applied too.

bzrudi71’s picture

@ingaro Yep it is allowed as long as quoted, but I still think it is absolutely no good practice to allow such identifiers at all. But that's my personal point of view. If other followers here like to see those identifiers supported for INSERT/UPDATE etc. I'm fine with that :)

erik.erskine’s picture

StatusFileSize
new1.43 KB

Just noticed a silly mistake in #9, where the escape function isn't actually doing anything. Uploading a new patch.

bzrudi71’s picture

Okay, after another night of sleep I think we should go for #11 as that will help with contrib modules and because we mimic the behavior of MySQL all around :) I think we will have no problems within the schema API itself as we already take good care of escaping. Also I see no problems for the entity system and views as well, because all columns are prefixed by field_ or something similar and that should be save to make them work. So we just have to take care for native select/insert/update/delete queries?

bzrudi71’s picture

StatusFileSize
new5.81 KB

Okay, I was to curios so I quick-hacked some test coverage for at least insert, update and delete. We have pass in insert and delete, but fail in update where 'offset' isn't escaped properly. Anyway, seems we can handle it this way and ensure better PG contrib support! I have very, very limited time over the next days, so feel free to work further here :)

Status: Needs review » Needs work

The last submitted patch, 13: 2477853-13.patch, failed testing.

bzrudi71’s picture

StatusFileSize
new5.81 KB

Quick-fixed typo, MySQL should pass now...

mradcliffe’s picture

Status: Needs work » Needs review

Flip to needs review.

bzrudi71’s picture

Title: PostgreSQL: Don't use OFFSET as field/column name in migrate tables » PostgreSQL: Add support for preserved field/column names
Issue summary: View changes
Status: Needs review » Needs work
Issue tags: -Needs issue summary update

Back to needs work as just a proof of concept ;) + IS Update

erik.erskine’s picture

StatusFileSize
new8.27 KB
new4.14 KB

Thanks for the extra test coverage.

#1600670: Cannot query Postgres database that has column names with capital letters addressed a similar concern, making case identifiers case-sensitive (again, technically allowed by PostgreSQL, but you need to escape them). It added some functions in the Drupal\Core\Database\Driver\pgsql\Connection class to escape table/column names if they have an uppercase character. Their use seems inconsistent across create table/insert/update etc though.

Is it best to always escape all identifiers? Are there any implications with doing that, other than an unnecessarily verbose query string?

I've attached a new patch that changes the various escape... functions to add the quotes regardless of case. Also calls the escaping for UPDATE statements.

bzrudi71’s picture

@ingaro thanks for your work on this issue! Please see the comments in the mentioned issue #1600670: Cannot query Postgres database that has column names with capital letters, why the identifiers are not all quoted by default. The changes for insert and update are looking good to me, but I think we should revert the changes within the escape functions please ;) Thanks again, and as soon as I have some time I will do a test run and code review.

mikeryan’s picture

Title: PostgreSQL: Add support for preserved field/column names » PostgreSQL: Add support for reserved field/column names
Component: migration system » postgresql db driver
Issue summary: View changes
daffie’s picture

Status: Needs work » Needs review
StatusFileSize
new8.27 KB

Changed the name of the patch file from comment #18 to have it tested by the testbot.
The patch looks good to me.
Does anybody know which tests this patch should fix?

@bzrudi71: Can you test the patch with a postgresql database.

Status: Needs review » Needs work

The last submitted patch, 21: 2477853-18.patch, failed testing.

bzrudi71’s picture

@daffie, this will fix all the remaining exceptions within the migrate_drupal tests :) Anyway, we can't go with the patch as is, because of my comment in #19. I really like to see this one getting in and hopefully have the time tomorrow to revert the changes regarding quoting by default, lets see :)

erik.erskine’s picture

StatusFileSize
new6.63 KB

Thanks for the feedback @bzrudi, and I now have some more time to work on this over the next few days.

Here is a new patch based on #18 but without the changes to the escape functions. This doesn't stop MigrateDrupal6Test from failing though, because the column name offset is no longer quoted within the INSERT statement.

Specifically, this code:

    $this->database->insert("event_timezones")->fields(array(
      'timezone',
      'name',
      'offset',
      'offset_dst',
      'dst_region',
      'is_dst',
    ))
    ->values(...);

... results in this SQL statement:

INSERT INTO simpletest1050020event_timezones (timezone, name, offset, offset_dst, dst_region, is_dst) VALUES ...

What I'm a bit uncertain of is why we are always quoting identifiers in the createTable method, but not insert/update. So the table is created ok despite the reseved work, but the tests fail once we try to populate it. Shouldn't the behaviour be consistent?

Please see the comments in the mentioned issue #1600670: Cannot query Postgres database that has column names with capital letters, why the identifiers are not all quoted by default.

Please can you clarify which comments you are referring to as I read through them but am still a bit confused.

daffie’s picture

Status: Needs work » Needs review

For the testbot

daffie’s picture

StatusFileSize
new9.43 KB

I have changed the patch so that only PostgreSQL reserved key words are quoted.
The following tests passes for me locally with a PostgreSQL backend:

  • Drupal\Tests\Core\Database\Driver\pgsql\PostgresqlConnectionTest
  • Drupal\migrate_drupal\Tests\d6\MigrateUserPictureFileTest
  • Drupal\migrate_drupal\Tests\d6\MigrateUserProfileEntityDisplayTest
  • Drupal\migrate_drupal\Tests\d6\MigrateUserProfileEntityFormDisplayTest
  • Drupal\migrate_drupal\Tests\d6\MigrateUserProfileFieldTest
  • Drupal\migrate_drupal\Tests\d6\MigrateUserProfileFieldInstanceTest
  • Drupal\migrate_drupal\Tests\d6\MigrateUserProfileValuesTest
  • Drupal\migrate_drupal\Tests\d6\MigrateUserTest
  • Drupal\migrate_drupal\Tests\d6\MigrateDrupal6Test

Status: Needs review » Needs work

The last submitted patch, 26: 2477853-26.patch, failed testing.

bzrudi71’s picture

Unfortunately I didn't find a minute to work at this today so happy to see some good progress here, thanks all :) At least I have just started a new full testbot run some minutes ago with the new approach by daffie (special approach, but lovely :)) and will post the result later.

Status: Needs work » Needs review

mradcliffe queued 26: 2477853-26.patch for re-testing.

bzrudi71’s picture

Okay, nice. We have 100% pass in migrate_drupal with patch from #26. The only thing I see are new fails in:
Drupal\system\Tests\Installer\SingleVisibleProfileTest 15 passes 9 fails
But not sure if this is related to this patch, needs investigation. Anyway a promising start :)
I agree with @ingaro that this is all but consistent regarding the escaping this time, but I think for now our main goal is 100% passing tests, right? I think of a follow-up to major clean up and deep review the pg-driver space and see how we can get more consistent once we have passing tests...

daffie’s picture

@bzrudi71: Thank you for testing the patch on your testbot. ;)

The Drupal\system\Tests\Installer\SingleVisibleProfileTest passes with the patch from #26 on my local machine.

bzrudi71’s picture

As a very last thing for today I ran the Installer tests twice and don't see the fails any more :) I didn't really review the patch yet so can we have some more comments on this approach from others please?

erik.erskine’s picture

The approach looks good to me, and the migrate_drupal tests that were failing before are all passing.

One small thing:

+++ b/core/lib/Drupal/Core/Database/Driver/pgsql/Connection.php
@@ -32,6 +32,26 @@ class Connection extends DatabaseConnection {
 
   /**
+   * The list of PostgreSQL reserved key words.
+   * See http://www.postgresql.org/docs/9.1/static/sql-keywords-appendix.html.
+   */

The list should probably be based on PostgreSQL 9.4, and include collation and lateral which have become reserved keywords since 9.1.

daffie’s picture

StatusFileSize
new2.28 KB
new9.44 KB

@ingaro: Thanks for the review and you made a very good point!

Added collation and lateral to the list.
Accidentally added over to the list. Now removed.

bzrudi71’s picture

Status: Needs review » Reviewed & tested by the community

I'm still not really happy with this approach but think we should go for now as is. As we do all and everything in PG driver space we can handle that later on once we get the quote-all-and-everything stuff done. We have pass, we have test, so let's do it :) RTBC
BTW: We need a follow up on commit (will take care of that) Thanks all!

bzrudi71’s picture

mradcliffe’s picture

Updated issue summary, added beta evaluation template, and beta evaluation after reviewing the issue and patch.

Firefox crashed on me the first time so I had to rewrite it.

alexpott’s picture

Status: Reviewed & tested by the community » Needs work
  1. Doing the following query in postgres
    select * from pg_get_keywords() where catcode in ('R', 'T');
    reveals that there are 99 reserved words - the list in the method appears to be 98 long. Not sure what is missing. Also the query looks useful for a kernel test :)
  2. +++ b/core/lib/Drupal/Core/Database/Driver/pgsql/Connection.php
    @@ -32,6 +32,26 @@ class Connection extends DatabaseConnection {
    +   * See http://www.postgresql.org/docs/9.4/static/sql-keywords-appendix.html.
    

    Should be @see and no fullstop and a blank line above.

  3. +++ b/core/lib/Drupal/Core/Database/Driver/pgsql/Connection.php
    @@ -32,6 +32,26 @@ class Connection extends DatabaseConnection {
    +  protected $postgresqlReservedKeyWords = ['all', 'analyse', 'analyze', 'and',
    +  'any', 'array', 'as', 'asc', 'asymmetric', 'authorization', 'binary', 'both',
    +  'case', 'cast', 'check', 'collate', 'collation', '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', 'from', 'full', 'grant',
    +  'group', 'having', 'ilike', 'in', 'initially', 'inner', 'intersect', 'into',
    +  'is', 'isnull', 'join', 'lateral', 'leading', 'left', 'like', 'limit',
    +  'localtime', 'localtimestamp', 'natural', 'not', 'notnull', 'null', 'offset',
    +  'on', 'only', 'or', 'order', 'outer', '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'];
    
    @@ -167,6 +187,10 @@ public function escapeField($field) {
    +    elseif (in_array(strtolower($escaped), $this->postgresqlReservedKeyWords)) {
    +      // Quote the field name for PostgreSQL reserved key words.
    +      $escaped = '"' . $escaped . '"';
    +    }
    
    @@ -181,6 +205,10 @@ public function escapeAlias($field) {
    +    elseif (in_array(strtolower($escaped), $this->postgresqlReservedKeyWords)) {
    +      // Quote the alias name for PostgreSQL reserved key words.
    +      $escaped = '"' . $escaped . '"';
    +    }
    

    This looks very testable. It'd be great to see a test that ensure all postgres reserved words are quoted as expected for both escapeField, escapeAlias, and escapeTable. Given that the reserved word list is queryable perhaps a kernel testbase that skips if the db is not pgsql would be good.

  4. +++ b/core/modules/system/src/Tests/Database/DeleteTruncateTest.php
    @@ -70,4 +70,20 @@ function testTruncate() {
    +   * Confirms that we can delete a single special column name record
    +   * successfully.
    

    Two line method summary - should be one line.

alexpott’s picture

My list from psql -c "select * from pg_get_keywords() where catcode in ('R', 'T');"

       word        | catcode |                 catdesc                 
-------------------+---------+-----------------------------------------
 all               | R       | reserved
 analyse           | R       | reserved
 analyze           | R       | reserved
 and               | R       | reserved
 any               | R       | reserved
 array             | R       | reserved
 as                | R       | reserved
 asc               | R       | reserved
 asymmetric        | R       | reserved
 authorization     | T       | reserved (can be function or type name)
 binary            | T       | reserved (can be function or type name)
 both              | R       | reserved
 case              | R       | reserved
 cast              | R       | reserved
 check             | R       | reserved
 collate           | R       | reserved
 collation         | T       | reserved (can be function or type name)
 column            | R       | reserved
 concurrently      | T       | reserved (can be function or type name)
 constraint        | R       | reserved
 create            | R       | reserved
 cross             | T       | reserved (can be function or type name)
 current_catalog   | R       | reserved
 current_date      | R       | reserved
 current_role      | R       | reserved
 current_schema    | T       | reserved (can be function or type name)
 current_time      | R       | reserved
 current_timestamp | R       | reserved
 current_user      | R       | reserved
 default           | R       | reserved
 deferrable        | R       | reserved
 desc              | R       | reserved
 distinct          | R       | reserved
 do                | R       | reserved
 else              | R       | reserved
 end               | R       | reserved
 except            | R       | reserved
 false             | R       | reserved
 fetch             | R       | reserved
 for               | R       | reserved
 foreign           | R       | reserved
 freeze            | T       | reserved (can be function or type name)
 from              | R       | reserved
 full              | T       | reserved (can be function or type name)
 grant             | R       | reserved
 group             | R       | reserved
 having            | R       | reserved
 ilike             | T       | reserved (can be function or type name)
 in                | R       | reserved
 initially         | R       | reserved
 inner             | T       | reserved (can be function or type name)
 intersect         | R       | reserved
 into              | R       | reserved
 is                | T       | reserved (can be function or type name)
 isnull            | T       | reserved (can be function or type name)
 join              | T       | reserved (can be function or type name)
 lateral           | R       | reserved
 leading           | R       | reserved
 left              | T       | reserved (can be function or type name)
 like              | T       | reserved (can be function or type name)
 limit             | R       | reserved
 localtime         | R       | reserved
 localtimestamp    | R       | reserved
 natural           | T       | reserved (can be function or type name)
 not               | R       | reserved
 notnull           | T       | reserved (can be function or type name)
 null              | R       | reserved
 offset            | R       | reserved
 on                | R       | reserved
 only              | R       | reserved
 or                | R       | reserved
 order             | R       | reserved
 outer             | T       | reserved (can be function or type name)
 overlaps          | T       | reserved (can be function or type name)
 placing           | R       | reserved
 primary           | R       | reserved
 references        | R       | reserved
 returning         | R       | reserved
 right             | T       | reserved (can be function or type name)
 select            | R       | reserved
 session_user      | R       | reserved
 similar           | T       | reserved (can be function or type name)
 some              | R       | reserved
 symmetric         | R       | reserved
 table             | R       | reserved
 then              | R       | reserved
 to                | R       | reserved
 trailing          | R       | reserved
 true              | R       | reserved
 union             | R       | reserved
 unique            | R       | reserved
 user              | R       | reserved
 using             | R       | reserved
 variadic          | R       | reserved
 verbose           | T       | reserved (can be function or type name)
 when              | R       | reserved
 where             | R       | reserved
 window            | R       | reserved
 with              | R       | reserved
(99 rows)
erik.erskine’s picture

StatusFileSize
new10.92 KB
new3.83 KB

The missing one is freeze. I've added this and also addressed points 2 and 4 in #38.

Added a new test in Drupal\system\Tests\Database\ConnectionTest that does the query @alexpott mentioned, and tests the various escapeXXX methods. Is this the right place to do that?

By having this query in the test we should also catch any new reserved words that might appear in future versions of PostgreSQL.

erik.erskine’s picture

Status: Needs work » Needs review
bzrudi71’s picture

@ingaro thanks a lot for the patch! I didn't review yet and just quickly applied locally. Noticed that it at lest seems to work as it discovered a new missing reserved keyword "over" in my installation that leads to failing tests :)

erik.erskine’s picture

StatusFileSize
new10.93 KB
new4.36 KB

Interesting. It looks like over was a reserved word up to and including 9.3, but is no longer. I had a look through other versions since 9.1 and as far as I can tell that is the only one.

I've added it to the list.

daffie’s picture

StatusFileSize
new733 bytes
new10.92 KB

The added test looks good to me. Thanks ingaro.

I think that Drupal\system\Tests\Database\ConnectionTest is the right place to add the new test for the escapeTable(), escapeField() and escapeAlias() methods.

By having this query in the test we should also catch any new reserved words that might appear in future versions of PostgreSQL.

We only test the keywords from the PostgreSQL database version(s) we use in our testbot.

The keyword "over" was in my patch from comment #26. I removed it later because in PostgreSQL 9.4 it is no longer a keyword. I thought that I made an error by adding it in the first place. :(

I made one minor documentation change to the patch:

+++ b/core/modules/system/src/Tests/Database/ConnectionTest.php
@@ -138,4 +138,24 @@ public function testMultipleStatementsForNewPhp() {
+   * Test the escapeTable(), escapeField() and escapeAlias() methods
+   * with all possible reserved words in PostgreSQL.

alexpott stated in comment #38.4 that a summary line should be on one line.

daffie’s picture

Status: Needs review » Reviewed & tested by the community

All points from alexpott are addressed.
The newly added Drupal\system\Tests\Database\ConnectionTest passes for me locally.
It all looks good to me.
The last patch from me was only a documentation change.
So for me it is back to RTBC.

bzrudi71’s picture

Status: Reviewed & tested by the community » Needs work

Sorry, I think all in all this looks very good just one nitpick so:

+++ b/core/modules/system/src/Tests/Database/ConnectionTest.php
@@ -138,4 +138,23 @@ public function testMultipleStatementsForNewPhp() {
+    $stmt = $db->query("select word from pg_get_keywords() where catcode in ('R', 'T')");

I think we usually use UPPERCASE in SQL queries...
The test itself looks good. I'm happy with testing this in ConnectionTest cause moving it over to CaseSensitiveTest feels wrong even if it is some kind of sensitive testing. Creating a new test class is also a bit overhead I think :)

daffie’s picture

Status: Needs work » Needs review
StatusFileSize
new10.92 KB
new722 bytes

Good point bzrudi71. I missed that one.

bzrudi71’s picture

Status: Needs review » Reviewed & tested by the community

As I expect test pass setting back to RTBC :) Just to remember: This is the last open issue on the way to 100% bot pass, so let's get this in! Thanks @all

alexpott’s picture

Status: Reviewed & tested by the community » Fixed

Committed 40335e9 and pushed to 8.0.x. Thanks!

Thanks for adding the beta evaluation to the issue summary.

  • alexpott committed 40335e9 on 8.0.x
    Issue #2477853 by ingaro, daffie, bzrudi71, mradcliffe, alexpott:...
Drupa1ish’s picture

Issue tags: -PostgreSQL +PostgreSQL;needs backport to D7
Drupa1ish’s picture

Issue tags: -PostgreSQL;needs backport to D7 +PostgreSQL, +Needs backport to D7
daffie’s picture

Version: 8.0.x-dev » 7.x-dev
Status: Fixed » Active

For the backport.

David_Rothstein’s picture

Status: Active » Patch (to be ported)
Crell’s picture

Version: 7.x-dev » 8.0.x-dev
Status: Patch (to be ported) » Needs work

I only just became aware of this issue via #2560965: Reserved column names are broken on MySQL, the test lies.

Per comments 5 and 7 in that issue, and the very-old issue linked from there as well, this fix is contrary to the design of the DB layer and is also incomplete and buggy. It should be reverted.

From the summary: "Some migrate tables use reserved keywords as column name like OFFSET". Well, then it shouldn't be using reserved keywords as columns. That's a deliberate design decision and changing that design should not be done in an ad hoc fashion like this.

  • alexpott committed 40335e9 on 8.1.x
    Issue #2477853 by ingaro, daffie, bzrudi71, mradcliffe, alexpott:...

Version: 8.0.x-dev » 8.1.x-dev

Drupal 8.0.6 was released on April 6 and is the final bugfix release for the Drupal 8.0.x series. Drupal 8.0.x will not receive any further development aside from security fixes. Drupal 8.1.0-rc1 is now available and sites should prepare to update to 8.1.0.

Bug reports should be targeted against the 8.1.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.2.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

  • alexpott committed 40335e9 on 8.3.x
    Issue #2477853 by ingaro, daffie, bzrudi71, mradcliffe, alexpott:...

  • alexpott committed 40335e9 on 8.3.x
    Issue #2477853 by ingaro, daffie, bzrudi71, mradcliffe, alexpott:...

Version: 8.1.x-dev » 8.2.x-dev

Drupal 8.1.9 was released on September 7 and is the final bugfix release for the Drupal 8.1.x series. Drupal 8.1.x will not receive any further development aside from security fixes. Drupal 8.2.0-rc1 is now available and sites should prepare to upgrade to 8.2.0.

Bug reports should be targeted against the 8.2.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.3.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

  • alexpott committed 40335e9 on 8.4.x
    Issue #2477853 by ingaro, daffie, bzrudi71, mradcliffe, alexpott:...

  • alexpott committed 40335e9 on 8.4.x
    Issue #2477853 by ingaro, daffie, bzrudi71, mradcliffe, alexpott:...

Version: 8.2.x-dev » 8.3.x-dev

Drupal 8.2.6 was released on February 1, 2017 and is the final full bugfix release for the Drupal 8.2.x series. Drupal 8.2.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.3.0 on April 5, 2017. (Drupal 8.3.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.3.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.4.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.3.x-dev » 8.4.x-dev

Drupal 8.3.6 was released on August 2, 2017 and is the final full bugfix release for the Drupal 8.3.x series. Drupal 8.3.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.4.0 on October 4, 2017. (Drupal 8.4.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.4.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.5.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

rosk0’s picture

Version: 8.5.x-dev » 8.6.x-dev

Drupal 8.5.0-alpha1 will be released the week of January 17, 2018, which means new developments and disruptive changes should now be targeted against the 8.6.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

alexpott’s picture

Status: Needs work » Fixed

Well this has not been reverted and I think the whole

this fix is contrary to the design of the DB layer and is also incomplete and buggy.

has been blown out-of-water by MySQL 8 and the new reserved words that's introduced. The decisions in #371: resolve ANSI SQL-92/99/2003 reserved words conflict in query statements are no longer tenable - db drivers need to be able to quote field (and table) names as they see fit. We are never going to be able to come up with a list of reserved words because Drupal just is not in charge of what different databases considered a reserved keyword.

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.

joseph.olstad’s picture

This issue appears to be preventing us from using aegir hostmaster with Postgresql