In a view, I created a combined fields filter, which was supposed to be exposed to the users, allowing a "universal search" by keywords matching multiple fields of some content type.

An attempt to use the exposed filter results in an error:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.field_editor_valuenode__field_journal.field_journal_target_idnode__field_note.f' at line 10: SELECT COUNT(*) AS expression FROM (SELECT 1 AS expression FROM {node_field_data} node_field_data LEFT JOIN {node__field_field_author} node__field_field_author ON node_field_data.nid = node__field_field_author.entity_id AND (node__field_field_author.deleted = :views_join_condition_0 AND node__field_field_author.langcode = node_field_data.langcode) LEFT JOIN {node__field_editor} node__field_editor ON node_field_data.nid = node__field_editor.entity_id AND (node__field_editor.deleted = :views_join_condition_2 AND node__field_editor.langcode = node_field_data.langcode) LEFT JOIN {node__field_journal} node__field_journal ON node_field_data.nid = node__field_journal.entity_id AND (node__field_journal.deleted = :views_join_condition_4 AND node__field_journal.langcode = node_field_data.langcode) LEFT JOIN {node__field_note} node__field_note ON node_field_data.nid = node__field_note.entity_id AND (node__field_note.deleted = :views_join_condition_6 AND node__field_note.langcode = node_field_data.langcode) LEFT JOIN {node__field_organization} node__field_organization ON node_field_data.nid = node__field_organization.entity_id AND (node__field_organization.deleted = :views_join_condition_8 AND node__field_organization.langcode = node_field_data.langcode) LEFT JOIN {node__field_publisher} node__field_publisher ON node_field_data.nid = node__field_publisher.entity_id AND (node__field_publisher.deleted = :views_join_condition_10 AND node__field_publisher.langcode = node_field_data.langcode) LEFT JOIN {node__field_school} node__field_school ON node_field_data.nid = node__field_school.entity_id AND (node__field_school.deleted = :views_join_condition_12 AND node__field_school.langcode = node_field_data.langcode) LEFT JOIN {node__field_titlehtml} node__field_titlehtml ON node_field_data.nid = node__field_titlehtml.entity_id AND (node__field_titlehtml.deleted = :views_join_condition_14 AND node__field_titlehtml.langcode = node_field_data.langcode) LEFT JOIN {node__field_abstract} node__field_abstract ON node_field_data.nid = node__field_abstract.entity_id AND (node__field_abstract.deleted = :views_join_condition_16 AND node__field_abstract.langcode = node_field_data.langcode) WHERE (( (node_field_data.status = :db_condition_placeholder_0) AND (node_field_data.type IN (:db_condition_placeholder_1)) AND( (CONCAT_WSnode_field_data.titlenode__field_field_author.field_field_author_valuenode__field_editor.field_editor_valuenode__field_journal.field_journal_target_idnode__field_note.field_note_valuenode__field_organization.field_organization_valuenode__field_publisher.field_publisher_valuenode__field_school.field_school_valuenode__field_titlehtml.field_titlehtml_valuenode__field_abstract.field_abstract_value LIKE :db_condition_placeholder_2 ESCAPE '\\') )))) subquery; Array ( [:db_condition_placeholder_0] => 1 [:db_condition_placeholder_1] => publication [:db_condition_placeholder_2] => %sdfs% [:views_join_condition_0] => 0 [:views_join_condition_2] => 0 [:views_join_condition_4] => 0 [:views_join_condition_6] => 0 [:views_join_condition_8] => 0 [:views_join_condition_10] => 0 [:views_join_condition_12] => 0 [:views_join_condition_14] => 0 [:views_join_condition_16] => 0 )

If I add only one field to the filter, the error looks a bit different:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'CONCAT_WSnode_field_data.title' in 'where clause': SELECT COUNT(*) AS expression FROM (SELECT 1 AS expression FROM {node_field_data} node_field_data WHERE (( (node_field_data.status = :db_condition_placeholder_0) AND (node_field_data.type IN (:db_condition_placeholder_1)) AND( (CONCAT_WSnode_field_data.title LIKE :db_condition_placeholder_2 ESCAPE '\\') )))) subquery; Array ( [:db_condition_placeholder_0] => 1 [:db_condition_placeholder_1] => publication [:db_condition_placeholder_2] => %sdf% )

But it seems that in both cases there are some spaces missing when constructing the query.

I experience this on a new website currently under construction. Started with Drupal 8.0.2, then upgraded to 8.0.3.

This happens when using the "Contains any word" operator, not when using "Contains"

CommentFileSizeAuthor
#63 interdiff.txt1.66 KBslasher13
#63 combine_filter_word-2664530-63.patch6.21 KBslasher13
#53 interdiff.txt1.29 KBslasher13
#53 combine_filter_word-2664530-53.patch5.28 KBslasher13
#52 combine_filter_word-2664530-52.patch5.18 KBslasher13
#52 interdiff.txt1.2 KBslasher13
#49 interdiff.txt1.84 KBslasher13
#49 combine_filter_word-2664530-49.patch5.2 KBslasher13
#42 combine_filter_word-2664530-41.patch4.89 KBLendude
#42 interdiff-2664530-39-41.txt641 bytesLendude
#39 combine_filter_word-2664530-39.patch4.9 KBLendude
#39 interdiff-2664530-26-39.txt623 bytesLendude
#31 revert-2664530.patch4.9 KBxjm
#31 postgres-fail-proof.patch292 bytesxjm
#26 combine_filter_word-2664530-26.patch4.9 KBLendude
#26 interdiff-2664530-20-26.txt1.22 KBLendude
#20 8.1.x-combine_filter_word-2664530-20.patch4.85 KBLendude
#20 8.0.x-combine_filter_word-2664530-20.patch4.82 KBLendude
#20 interdiff-2664530-15-20.txt534 bytesLendude
#17 8.1.x-combine_filter_word-2664530-15.patch4.83 KBLendude
#17 8.0.x-combine_filter_word-2664530-15.patch4.82 KBLendude
#17 interdiff-2664530-13-15.txt2.49 KBLendude
#13 8.1.x-combine_filter_word-2664530-13.patch4.93 KBLendude
#13 8.0.x-combine_filter_word-2664530-13.patch4.92 KBLendude
#13 interdiff-2664530-8-13.txt753 bytesLendude
#8 combine_filter_word-2664530-8.patch4.77 KBLendude
#6 combine_filter_word-2664530-6-TEST_ONLY.patch1.8 KBLendude
Support from Acquia helps fund testing for Drupal Acquia logo

Comments

vakorol created an issue. See original summary.

Lendude’s picture

Title: Combined fields filter results in an incorrect SQL query » Views Combined fields filter results in an incorrect SQL query
Project: Views (for Drupal 7) » Drupal core
Version: 8.x-3.x-dev » 8.0.x-dev
Component: exposed filters » views.module
Issue tags: -exposed filter, -combined fields, -sql error, -Drupal 8.x

Moving to the right queue.

Lendude’s picture

Status: Active » Postponed (maintainer needs more info)

Do you have an export of this View? This is not a standard View since it uses an expression and a subquery. Do you have some steps to reproduce this?

andrew.trebble’s picture

I'm experiencing the same behaviour. All the other filters I put on the view are working correctly but the combined field filter causes the same error.

Using Drupal 8.0.5.

To recreate it I just needed to create a view, add a few fields and then add an exposed combined field filter that searches on several of the fields. Also add a regular filter on a single field. The single field filter works fine by itself. If I put a search term into the the combined field filter it dies with the SQL error as vakorol reported.

Through a little testing I think I was able to narrow it down a little. When the operator on the combined filter is "Contains any word" then the filter causes the crash. If I set it to "is equal to" then the filter doesn't crash.

EDIT: "Contains" operator works as well. It seems to be the "Contains any word" operator that causes a problem for me. I have not tested the other operators.

Hope that helps.

Lendude’s picture

Title: Views Combined fields filter results in an incorrect SQL query » Views Combined fields filter with "Contains any word" operator results in an incorrect SQL query
Issue summary: View changes
Status: Postponed (maintainer needs more info) » Active

"Contains" operator works as well. It seems to be the "Contains any word" operator that causes a problem for me. I have not tested the other operators.

@andrew.trebble Yup that was the bit that did it, thanks!

Lendude’s picture

Status: Active » Needs review
FileSize
1.8 KB

Here is a failing test for this.

The reason it fails is that the Combine filter doesn't override the opContainsWord() method, but haven't managed to get that to work yet.

Status: Needs review » Needs work

The last submitted patch, 6: combine_filter_word-2664530-6-TEST_ONLY.patch, failed testing.

Lendude’s picture

Status: Needs work » Needs review
FileSize
4.77 KB

Not sure if this is the most elegant way to fix this, but it's a fix.

Lendude’s picture

Title: Views Combined fields filter with "Contains any word" operator results in an incorrect SQL query » Views Combined fields filter with "Contains any word" or "Contains all words" operator results in an incorrect SQL query and a fatal error
Priority: Normal » Major

Bumping to major since this results in a fatal error.

andrew.trebble’s picture

Patch in #8 worked for me. Thanks Lendude.

dawehner’s picture

Status: Needs review » Reviewed & tested by the community

Nice!

catch’s picture

Status: Reviewed & tested by the community » Needs work
+++ b/core/modules/views/src/Plugin/views/filter/Combine.php
@@ -137,6 +137,36 @@ protected function opContains($expression) {
+  protected function opContainsWord($expression) {

Needs docs, even if it's just @inheritdoc

Lendude’s picture

Docs added. @inheritdoc wouldn't work since the parent method doesn't have any docs either (nor do any of the other ops methods, we should fix that...).

8.1.x patch should work for 8.2.x too.

dawehner’s picture

Status: Needs review » Reviewed & tested by the community

Thank you @Lendude!!

alexpott’s picture

Status: Reviewed & tested by the community » Needs work
  1. +++ b/core/modules/views/src/Plugin/views/filter/Combine.php
    @@ -137,6 +137,42 @@ protected function opContains($expression) {
    +   * Filters by one or more words.
    +   *
    +   * By default opContainsWord uses add_where, that doesn't support complex
    +   * expressions.
    +   */
    +  protected function opContainsWord($expression) {
    

    Missing @param documentation

  2. +++ b/core/modules/views/src/Plugin/views/filter/Combine.php
    @@ -137,6 +137,42 @@ protected function opContains($expression) {
    +        $this->query->addWhereExpression($group, "$expression LIKE $temp_placeholder", array($temp_placeholder => '%' . db_like($word) . '%'));
    

    db_link() is deprecated but there's no inject database to easily use so this looks okay to me.

  3. +++ b/core/modules/views/src/Plugin/views/filter/Combine.php
    @@ -137,6 +137,42 @@ protected function opContains($expression) {
    +    preg_match_all('/ (-?)("[^"]+"|[^" ]+)/i', ' ' . $this->value, $matches, PREG_SET_ORDER);
    ...
    +      if ($match[2]{0} == '"') {
    +        $match[2] = substr($match[2], 1, -1);
    +        $phrase = TRUE;
    +      }
    

    Is all of this properly tested?

David4514’s picture

I'm also experiencing the same problem. The patch in #13 works for me. Thanks @Lendude.

Lendude’s picture

15.1 Added.
15.2 Cool.
15.3 I updated the test to contain a 'phrase', so the preg_match_all() double quote logic is tested. Taking a closer look at it, it's unclear to me what the preg_split() is supposed to be doing anyway. Since the first preg_match_all() already splits on ' ', I don't see what the preg_split() is supposed to accomplish. Taking it out leaves the tests green, so unless somebody can think of a search sting to turn it red, lets leave it out.

8.1.x patch should apply to 8.2.x too.

Status: Needs review » Needs work

The last submitted patch, 17: 8.1.x-combine_filter_word-2664530-15.patch, failed testing.

alexpott’s picture

Issue tags: +Triaged core major

Discussed with @xjm and @catch. We agree that this is major because this results in an exception through normal usage of views.

Lendude’s picture

Forgot age... no change in the 8.0 patch, but reposting to keep everything together.

Lendude’s picture

Status: Needs work » Needs review
David4514’s picture

On an 8.1.x-dev system I applied the patch from #20. My view is only using the "Contains All Word" variety of the filter, but it seems to work as expected.

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.

ChristianAdamski’s picture

Status: Needs review » Reviewed & tested by the community

Had the same issue on 8.1.2. #20 fixed it.

catch’s picture

Status: Reviewed & tested by the community » Needs work
  1. +++ b/core/modules/views/src/Plugin/views/filter/Combine.php
    @@ -137,6 +137,39 @@ protected function opContains($expression) {
    +    preg_match_all('/ (-?)("[^"]+"|[^" ]+)/i', ' ' . $this->value, $matches, PREG_SET_ORDER);
    

    This needs a comment.

  2. +++ b/core/modules/views/src/Plugin/views/filter/Combine.php
    @@ -137,6 +137,39 @@ protected function opContains($expression) {
    +      if ($match[2]{0} == '"') {
    +        $match[2] = substr($match[2], 1, -1);
    +      }
    

    Why not just trim?

Lendude’s picture

@catch thanks for the feedback! So something like this?

dawehner’s picture

Status: Needs review » Reviewed & tested by the community
+++ b/core/modules/views/src/Plugin/views/filter/Combine.php
@@ -157,11 +159,8 @@ protected function opContainsWord($expression) {
-      // Strip off phrase quotes
-      if ($match[2]{0} == '"') {
-        $match[2] = substr($match[2], 1, -1);
-      }
-      $word = trim($match[2], ',?!();:-');
+      // Clean up the user input and remove the sentence delimiters.
+      $word = trim($match[2], ',?!();:-"');

Nice improvement!

catch’s picture

Status: Reviewed & tested by the community » Fixed

Committed/pushed to 8.2.x and cherry-picked to 8.1.x, thanks!

Gave review credit to andrew.trebble (post commit) for the clear steps to reproduce.

  • catch committed a64ea9d on 8.2.x
    Issue #2664530 by Lendude: Views Combined fields filter with "Contains...

  • catch committed 574487f on 8.1.x
    Issue #2664530 by Lendude: Views Combined fields filter with "Contains...
xjm’s picture

I think this issue may have broken postgres.

xjm’s picture

Testbot doesn't like patches on fixed issues now apparently. Uploaded at #2756595: test issue.

The relevant CI fail: https://www.drupal.org/pift-ci-job/346519

  • xjm committed bb2efca on 8.2.x
    Revert "Issue #2664530 by Lendude: Views Combined fields filter with "...

  • xjm committed fa3faf2 on 8.1.x
    Revert "Issue #2664530 by Lendude: Views Combined fields filter with "...
xjm’s picture

Status: Fixed » Needs work

Confirmed; it fails on Postgres. I reverted the commit in both 8.2.x and 8.1.x.

Lendude’s picture

Well that will teach me to add tests for other databases when messing with views query building.....thanks for the revert @xjm!

I know next to nothing about Postgres, so no idea how to fix this.

For people familiar with postgres but not views, this is the final query that is build by the test:

"SELECT views_test_data.age AS views_test_data_age, views_test_data.id AS id, views_test_data.name AS views_test_data_name, views_test_data.job AS views_test_data_job, views_test_data.id AS views_test_data_id 
FROM {views_test_data} views_test_data 
WHERE (( (CONCAT_WS(' ', views_test_data.name, ' ', views_test_data.job) LIKE :views_combine_0) OR (CONCAT_WS(' ', views_test_data.name, ' ', views_test_data.job) LIKE :views_combine_1) )) 
ORDER BY views_test_data_id ASC"

I assume the problem stems from using a CONCAT_WS inside a WHERE clause, but *shrug*

  • catch committed a64ea9d on 8.3.x
    Issue #2664530 by Lendude: Views Combined fields filter with "Contains...
  • xjm committed bb2efca on 8.3.x
    Revert "Issue #2664530 by Lendude: Views Combined fields filter with "...

  • catch committed a64ea9d on 8.3.x
    Issue #2664530 by Lendude: Views Combined fields filter with "Contains...
  • xjm committed bb2efca on 8.3.x
    Revert "Issue #2664530 by Lendude: Views Combined fields filter with "...
Lendude’s picture

Bleh, Postgres is case sensitive, well at least I now know how to run tests on postgres locally.....

This passes locally on postgres now.

dawehner’s picture

Its nice that the combined filter is able to filter something like this now.

  1. +++ b/core/modules/views/src/Plugin/views/filter/Combine.php
    @@ -133,6 +133,38 @@ protected function opContains($expression) {
    +    // Match all words separated by spaces or sentences when encapsulated by
    +    // double quotes.
    +    preg_match_all('/ (-?)("[^"]+"|[^" ]+)/i', ' ' . $this->value, $matches, PREG_SET_ORDER);
    

    Nitpick: maybe add a comma before 'when', so its clear "when encapsulated by double words" is just for sequences.

  2. +++ b/core/modules/views/src/Plugin/views/filter/Combine.php
    @@ -133,6 +133,38 @@ protected function opContains($expression) {
    +      $this->query->addWhereExpression($group, "$expression LIKE $temp_placeholder", array($temp_placeholder => '%' . db_like($word) . '%'));
    

    Potential follow-up: Replace db_like with Database::getConnection()->escapeLike($string) whereever possible, in views.

Lendude’s picture

Fixed comment by removing 'when' altogether, I think this is even clearer then adding the comma.

opened follow-up #2784739: Fix PostgreSQL operator in views

Lendude’s picture

dawehner’s picture

Status: Needs review » Reviewed & tested by the community

Nice!

The last submitted patch, 31: revert-2664530.patch, failed testing.

Status: Reviewed & tested by the community » Needs work

The last submitted patch, 42: combine_filter_word-2664530-41.patch, failed testing.

Lendude’s picture

Status: Needs work » Reviewed & tested by the community

Unrelated fails

catch’s picture

Status: Reviewed & tested by the community » Needs review

The postgres driver maps LIKE to ILIKE for normal condition queries: https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Database%...

We shouldn't introduce driver-specific logic here, but the behaviour should be the same IMO.

Having said that I see this a lot in StringFilter and Combine, so might need to be a follow-up bug report to look at all of those queries?

Lendude’s picture

I updated the follow-up #2784739: Fix PostgreSQL operator in views to also fix the hardcoded LIKE and NOT LIKE instances. Since both mapConditionOperator and escapeLike would require the connection it's probably easiest to tackle both at the same time.

@catch would that address your concerns?

slasher13’s picture

Did you mean that?
addresses #40.2 and revert changes from #39

Status: Needs review » Needs work

The last submitted patch, 49: combine_filter_word-2664530-49.patch, failed testing.

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.

slasher13’s picture

slasher13’s picture

Lendude’s picture

Status: Needs review » Reviewed & tested by the community

I think this addresses the concerns catch had in #47, in the follow-up #2784739: Fix PostgreSQL operator in views we should update everything to use this pattern.

Tests are passing on all databases, so this looks good to me. Nice!

slasher13’s picture

  • random error with PHP 5.5 & SQLite 3.8 (added to re-test)
  • updated follow-up
Anonymous’s picture

Why do we use a complex expression as:
preg_match_all('/ (-?)("[^"]+"|[^" ]+)/i', ' ' . $this->value, $matches, PREG_SET_ORDER);
instead

preg_match_all('/"[^"]+"|[^" ]+/', $this->value, $matches);
#...
foreach ($matches[0] as $match_key => $match) {
  #...
  $word = trim($match, ',?!();:-"');

without:

  • (-?) // it remove by next trim
  • /i // regexp haven't alphabet symbols
  • (...) // we not use pockets
Lendude’s picture

Why do we use a complex expression

Because I just copy/pasted it from \Drupal\views\Plugin\views\filter\StringFilter::opContainsWord and figured "if it ain't broke....."

I think from a sanity point of view they should use the same regex and changing StringFilter is out of scope here, maybe open a follow-up if this lands and update both?

Anonymous’s picture

@Lendude, thank you for answer and great work! And if we will refactoring it, I think that the next regexp will be enough:

/".+?"|\S+/

Also, maybe add description about "related words" ability to UI form build filter value. Because it is not quite clear to me, though I am ashamed to admit this :)

alexpott’s picture

Status: Reviewed & tested by the community » Needs work

I think it is in scope to ensure that \Drupal\views\Plugin\views\filter\Combine::opContainsWord() uses the same regex as \Drupal\views\Plugin\views\filter\StringFilter::opContainsWord() because we're implementing an override of that method. The simplest thing to do is just add the regex as a class constant to StringFilter and then use it in both methods.

Everything else looks great and it is fantastic to be building up our views test coverage.

Anonymous’s picture

Maybe static method?

// @file /core/modules/views/src/Plugin/views/filter/StringFilter.php

public static function getWords($text) {
    $words = array();    
    if (!empty($text)) {
      // @TODO: Refactoring regexp after test covarage. Example: /".+?"|\S+/
      // preg_match_all('/".+?"|\S+/', $text, $matches);
      preg_match_all('/ (-?)("[^"]+"|[^" ]+)/i', ' ' . $text, $matches, PREG_SET_ORDER);
      

      foreach ($matches as $match_key => $match) {
        // Clean up the user input and remove the sentence delimiters.
        $word = trim($match[2], ',?!();:-"');
        $words[] = $word;
      }
    }
    return $words;
}

Example usage:

// @file /core/modules/views/src/Plugin/views/filter/StringFilter.php

  protected function opContainsWord($field) {
    $where = $this->operator == 'word' ? db_or() : db_and();

    $words = StringFilter::getWords($this->value);
    foreach ($words as $word) {
        $where->condition($field, '%' . db_like($word) . '%', 'LIKE');
    }

    if (!$where) {
      return;
    }
    // previously this was a call_user_func_array but that's unnecessary
    // as views will unpack an array that is a single arg.
    $this->query->addWhere($this->options['group'], $where);
  }
// @file /core/modules/views/src/Plugin/views/filter/Combine.php

  protected function opContainsWord($expression) {
    $placeholder = $this->placeholder();
    $type = $this->operator == 'word' ? 'OR' : 'AND';
    $group = $this->query->setWhereGroup($type);
    $operator = Database::getConnection()->mapConditionOperator('LIKE');
    $operator = isset($operator['operator']) ? $operator['operator'] : 'LIKE';

    $words = StringFilter::getWords($this->value);
    foreach ($words  as $word_key => $word) {
      $temp_placeholder = $placeholder . '_' . $word_key;
      $this->query->addWhereExpression($group, "$expression $operator $temp_placeholder", array($temp_placeholder => '%' . Database::getConnection()->escapeLike($word) . '%'));
    }
  }
Lendude’s picture

@vaplas Lets not add methods, that would make this an API change and push this to 8.3.x (or 8.4.x). I like the idea, I'm just not thrilled about the impact it has on fixing this. Lets just get this working.

I'd say just go with what @alexpott suggested, add the regex as a class contant to \Drupal\views\Plugin\views\filter\StringFilter and use that. Clean, concise, no BC breakage.

Anonymous’s picture

@Lendude, I totally agree with you! I just wanted to know THE SECRET of the regexp :) Sorry!

slasher13’s picture

Anonymous’s picture

And I also found something. The difference between the two patches reminiscent instructions "How to draw owl" :)

PS.
But, perhaps, the great @gordon just secretly used it (-?) to identify specific queries in Commerce :)

Lendude’s picture

Status: Needs review » Reviewed & tested by the community

Feedback from #59 has been addressed, still passes on all supported databases, nice!

slasher13’s picture

  • catch committed 71f2758 on 8.3.x
    Issue #2664530 by Lendude, slasher13, catch, alexpott, andrew.trebble:...

  • catch committed 795c83b on 8.2.x
    Issue #2664530 by Lendude, slasher13, catch, alexpott, andrew.trebble:...
catch’s picture

Status: Reviewed & tested by the community » Fixed

Committed/pushed to 8.3.x and cherry-picked to 8.2.x, thanks!

Status: Fixed » Closed (fixed)

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