Issue Summary:

Theme .info files which do not properly define the 'name' attribute break the menu generation. system_menu() provides the menu entries corresponding to themes -- the relevant code is:

foreach (list_themes() as $theme) {
    $items['admin/appearance/settings/' . $theme->name] = array(
      'title' => $theme->info['name'], 
      // ...
    );
  }

In the case of a malformed theme .info file, $theme->info['name'] can be NULL, causing the following error:

WD menu: PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column [error]
'title' cannot be null: INSERT INTO {menu_router} (path, load_functions,
to_arg_functions, access_callback, access_arguments, page_callback, page_arguments,
...

The actual error message is very long and difficult to diagnose.

Nowhere do we verify the required attributes of the .info file are even set. This could be done in _system_rebuild_theme_data(), for example. Or perhaps wrapping $theme->info['name'] in a check_plain() call would be sufficient (as is done in block.module).

Steps to Reproduce:

drush dl sky-7.x-1.0
drush -y vdel menu_masks
drush cc all

Boom, site broken. (The deletion of the menu_masks variable is optional -- you can still see piles of error messages on clearing the cache even if you preserve that variable.)

I've attached the simplest patch for this bug, namely one that sets $theme[$key]->info['name'] to $key if it is not already set. (In the cited example, $key here would be 'sky').

Recommendations

There are at least two possible fixes:

  1. Set the $theme->info['name'] to the theme $key if it is not provided. For example, the sky theme would have $info['name'] set to 'sky'. Optionally write a warning to the watchdog.
  2. Raise an exception if $theme->info['name'] is not provided.

Status

A patch implementing the first recommendation is available in #58, but has a typographical error as noted in #66.

CommentFileSizeAuthor
#163 theme-info-name-619542-163.patch1.54 KBJohnAlbin
#146 malformed_theme_info-619542-146.patch480 bytesmalcomio
#140 619542.140.patch271.33 KBjayeshanandani
#138 619542.138.patch4.37 KBjayeshanandani
#132 drupal--619542--malformed-theme-info-files-break-router-generation--132.patch814 bytesamontero
#117 Malformed_theme_info_files_break_menu_router_generation-619542-117.patch492 bytesamontero
#109 Malformed_theme_info_files_break_menu_router_generation-619542-109.patch481 bytesdcrocks
#107 theme_info_error_msgs-619542-107.patch5.99 KBdcrocks
#100 theme-info-error-msgs.png254.03 KBdcrocks
#100 theme_info_error_msgs-619542-100.patch5.96 KBdcrocks
#99 malformed info.png313.83 KBdcrocks
#96 Appearance.png312.79 KBdcrocks
#87 malformed_info_files-619542-87-7x.patch2.2 KBdcrocks
#86 malformed_info_files-619542-86-8x.patch2.2 KBdcrocks
#85 malformed_info_files-619542-85-8x.patch1.83 KBdcrocks
#79 theme_name.patch979 bytescatch
#79 theme_name_test_and_fix.patch1.25 KBcatch
#79 theme_name_broken.patch299 bytescatch
#68 theme-info-name-619542-68.patch740 bytesbfroehle
#58 619542-58-fix-malformed-theme-info.patch1.06 KBbfroehle
#40 MySQLTablesAfterError.png176.95 KBTor Arne Thune
#43 patch-for-1V.txt318 bytesbfroehle
#39 MySQLTablesAfterError.png176.95 KBTor Arne Thune
#38 619542-38-validate_theme_info_files.patch1.15 KBbfroehle
#33 619542-33-malformed_theme_info_breaks_menu.patch570 bytesbfroehle
#27 update.sql_.txt233.08 KBolamaekle
#24 watchdog_show_blob.png145.05 KBbfroehle
#22 variables-entry.png27.52 KBolamaekle
#19 semaphore-entry.png33.84 KBolamaekle
Support from Acquia helps fund testing for Drupal Acquia logo

Comments

tlattimore’s picture

Title: WAMP Localhost SQL syntex error » PDOException: SQLSTATE[42000]: Syntax error
slip’s picture

I had a similar issue on LAMP... I deleted my D7 DB, recreated it, reset my settings.php file, cleared my browser's cache and started the installation process over again... worked that time.

ycwjjjj’s picture

Yes, i have the similar case too. I am with D7, XAMPP, mysql DB with both Window XP and Vista. I try to back up a database by just copying the whole directory. When restoring, I just create a newly table with the same name of the directory (database) with phpmyadmin and paste it back to the directory under /mysql/data in window file system. It was working fine when in D6 but not in D7. Now, I have to formally create the xxx.sql file to back up and restore the whole database.

Amazon’s picture

I am installing both Alpha3 and head this morning and still getting both these errors with the Acquia stack installer.

rjgoldsborough’s picture

I just wanted to update this as I was getting this error just today with the most recent HEAD checked out as of 8:30 this morning. Simply dropping the db and reinstalling helped but there may be an underlying problem.

Edit**

System info:
Ubuntu 9.10
Apache 2.2.12
PHP Version 5.2.10

jwatt’s picture

Same problem every time using latest MAMP:

http://www.mamp.info/downloads/releases/MAMP_PRO.dmg.zip

and a fresh database created using:

mysql -u root -p <<EOF
DROP DATABASE IF EXISTS \`drupaldb\`;
CREATE DATABASE \`drupaldb\` DEFAULT CHARACTER SET utf8;
quit
EOF
likewhoa’s picture

Priority: Normal » Major

Same here with RC2, php-5.3.4,nginx-0.8.53 & mariadb-5.1.53.. setting to major since this not only affects d7 but other httpd and php versions.

PDOException: 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 ') ORDER BY fit DESC LIMIT 0, 1' at line 1: SELECT * FROM {menu_router} WHERE path IN () ORDER BY fit DESC LIMIT 0, 1; Array ( ) in menu_get_item() (line 427 of /home/localhost/htdocs/includes/menu.inc).

bfroehle’s picture

@likewhoa: Can you confirm this happens for the latest 7.x-dev version of Drupal?

The error is happening because $ancestors is somehow empty:

      $parts = array_slice($original_map, 0, MENU_MAX_PARTS);
      $ancestors = menu_get_ancestors($parts);
      $router_item = db_query_range('SELECT * FROM {menu_router} WHERE path IN (:ancestors) ORDER BY fit DESC', 0, 1, array(':ancestors' => $ancestors))->fetchAssoc();
myared’s picture

subscribing... i'm testing d7 rc3 with:

ubunutu 10.10 (Linux 2.6.35 64-bit)
apache 2.2.16
mysql 5.1.49
php 5.3.3

likewhoa’s picture

@bfroehle The problem with the dev snapshot is that it doesn't detect my MariaDB server and just gives me option for postgresSQL only even though it's not running. I also have another issue which I need to reproduce on other servers which involves not being able to install while in https.

EDIT: I forgot to update this comment with:
If you compile php-5.3.x with 'mysqli pdo' but no 'mysql' support then you won't notice the mysql/mariadb in setup.

likewhoa’s picture

Status: Active » Fixed

This works for me now with latest snapshot, therefore closing bug.

Tor Arne Thune’s picture

Title: PDOException: SQLSTATE[42000]: Syntax error » PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064
Assigned: tlattimore » Unassigned
Status: Fixed » Active

I got the same error today when I tried to install Drupal 7.0.

PDOException: 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 ') ORDER BY fit DESC LIMIT 0, 1' at line 1: SELECT * FROM {menu_router} WHERE path IN () ORDER BY fit DESC LIMIT 0, 1; Array ( ) in menu_get_item() (line 443 of /home/content/39/5986639/html/includes/menu.inc).

LAMP server, shared hosting (GoDaddy).

likewhoa’s picture

1V then something must to changed because and i will try to reproduce again. Are you sure you are using 7.x-dev?

Tor Arne Thune’s picture

Yes. I dropped my database and reset settings.php, and the install went fine the second time. I noticed I was not allowing cookies the first time, so maybe that had something to do with the error.
This issue is still valid though. I am planning on setting up another web site in the coming days on the same shared host. I will see if I can reproduce the bug then.

bfroehle’s picture

Great. Please post explicit steps used to reproduce the bug and we'll try to get to the bottom of it.

olamaekle’s picture

Is there another possibility because I use the database for another site to so I can't drop it. Is it posible to export it, drop it then import it again or do I have to delete it?

cocaine2000’s picture

I just downloaded the official D7. Got the same error. Did all the above. Reseting the settings.php and recreating DB with utf8. but got the same error again. Fedora 12, mysql - 5.1.46,, PHP 5.3.2. My php is from Send Engine v2.3.0.. Would that be any reason? Error below:

PDOException: 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 ') ORDER BY fit DESC LIMIT 0, 1' at line 1: SELECT * FROM {menu_router} WHERE path IN () ORDER BY fit DESC LIMIT 0, 1; Array ( ) in menu_get_item() (line 443 of /XXXXXX/drupal-7.0/includes/menu.inc).

bfroehle’s picture

Does this happen for all pages on your site? Or only when you view the main page? For example, can you go to http://yourdrupalsite/admin ? What does the menu_masks entry in {variables} (in your SQL database) look like? Does the {semaphore} table have any entries? Are there any entries at the bottom of {watchdog} about the menu rebuilding process?

Do page loads take forever? (like 30+ seconds)?

Edit:
What I'm thinking is going on here is that the menu_masks variable isn't getting created correctly, so menu_get_ancestors is returning an empty array which kills the MySQL query.

olamaekle’s picture

FileSize
33.84 KB

Get the same error when trying to visit mydomain.com/admin. And in the {watchdog} this message is listed:

%type: !message in %function (line %line of %file).

The type is "php" and the location is "http://mydomain.com/" and also "http://mydomain.com/admin".

There are no menu_masks in the {variables} entry. The attachment is a picture of {semaphore}.

olamaekle’s picture

I get the following error message on Configure site and Finished when I install Drupal:

Notice: Undefined index: name in block_menu() (line 147 of /home/*/sub_html/update/modules/block/block.module).
Notice: Undefined index: name in block_menu() (line 166 of /home/*/sub_html/update/modules/block/block.module).
Notice: Undefined index: name in system_menu() (line 641 of /home/*/sub_html/update/modules/system/system.module).
Notice: Undefined index: name in block_menu() (line 147 of /home/*/sub_html/update/modules/block/block.module).
Notice: Undefined index: name in block_menu() (line 166 of /home/*/sub_html/update/modules/block/block.module).
Notice: Undefined index: name in system_menu() (line 641 of /home/*/sub_html/update/modules/system/system.module).
bfroehle’s picture

olamaekle: For the entry of {watchdog} you reference above (%type: !message in %function (line %line of %file).) can you send along the contents of the variables field? That will have the information about where the exception was thrown.

olamaekle’s picture

FileSize
27.52 KB

bfroehle: Is it this you want (the attachment)?

This is how I tried to install Drupal:

First attempt (failed, got the error)

Number of contrib modules: 47
Number of contrib themes: 15

Second attempt (no error messages at all)

Number of contrib modules: 19
Number of contrib themes: 4
Everything else is the same

Maybe that has something to do with the error?

Stevel’s picture

No, he means the variables field that is in the watchdog table. Also, try to get the binary data to show the contents instead of just BLOB (there should be an option for that under 'Innstillinger').

bfroehle’s picture

FileSize
145.05 KB

olamaekle: Sorry, no I was referring to the variables column of the {watchdog} table. In phpMyAdmin this always shows as [blob] for me, except that if you open the frame in a new tab and append &display_blob=true at the end of the URL, it'll display their contents. (See the attached image).

What'd be most helpful is probably a straight dump of the {watchdog} table. Select the watchdog table, choose export, un-select the "Use hexadecimal for BLOB" option, and click go. Save the results in a txt file and upload them here.

olamaekle’s picture

bfroehle: Now I think I got it:

a:6:{s:5:"%type";s:12:"PDOException";s:8:"!message";s:329:"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 &#039;) ORDER BY fit DESC LIMIT 0, 1&#039; at line 1: SELECT * FROM {menu_router} WHERE path IN () ORDER BY fit DESC LIMIT 0, 1; Array\n(\n)\n";s:9:"%function";s:15:"menu_get_item()";s:5:"%file";s:46:"/home/olamaeir/sub_html/test/includes/menu.inc";s:5:"%line";i:443;s:14:"severity_level";i:3;}

Like this?

bfroehle’s picture

Yes! Except we need the watchdog entries which appear before this one, as that's where the real error is occurring. Can you provide a dump (i.e., export) of the watchdog table as described in comment #24?

Thanks, I appreciate your helpfulness in working through this bug!

olamaekle’s picture

FileSize
233.08 KB

Sorry I'm kinda new to this but lets try again.

bfroehle’s picture

Title: PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 » PDOException: SQLSTATE[23000]: ... Column 'title' cannot be null: INSERT INTO {menu_router}

This is wonderful, the problem behind the visible error message you are seeing is this one (which is watchdog id = 8 in the txt file you posted in #27)

PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'title' cannot be null: INSERT INTO {menu_router} ... in _menu_router_save() (line 3674 of /home/olamaeir/sub_html/test/includes/menu.inc).

I'm retitling to give a better description of the error, and am investigating further. Was this on a fresh install of D7 or an upgrade? Did you have any contributed modules or themes present?

olamaekle’s picture

Both in #22 was exactly the same except fewer contrib modules and themes. Both where fresh install with a minor modification in .htaccess (line added: suPHP_ConfigPath /home/username/).

bfroehle’s picture

Well, your problem is the Sky theme, version 7.x-1.0, and issue #1016854: The info file (temporary://update-extraction/sky/sky.info) does not define a 'name' attribute.. Upgrade to Sky theme version 7.x-1.1 and verify that your problem goes away.

olamaekle’s picture

WOW! Great work bfroehle, it worked. Thank you.

bfroehle’s picture

Title: PDOException: SQLSTATE[23000]: ... Column 'title' cannot be null: INSERT INTO {menu_router} » Malformed theme .info files break menu_router generation
Component: base system » theme system

Issue Summary:

Theme .info files which do not properly define the 'name' attribute break menu_router generation. When we rebuild the menu_router system, we generate a list of paths with menu_router_build(). This, of course, calls hook_menu(). system_menu() provides the menu entries corresponding to themes -- the relevant code is:

foreach (list_themes() as $theme) {
    $items['admin/appearance/settings/' . $theme->name] = array(
      'title' => $theme->info['name'], 
      'page arguments' => array('system_theme_settings', $theme->name), 
      'type' => MENU_LOCAL_TASK, 
      'access callback' => '_system_themes_access', 
      'access arguments' => array($theme), 
      'file' => 'system.admin.inc',
    );
  }

In the case of a malformed theme .info file, $theme->info['name'] can be NULL.

Note, in no place that I am aware of do we verify the required attributes of the .info file are even set. This could be done in _system_rebuild_theme_data(), for example. Or perhaps wrapping $theme->info['name'] in a check_plain() call would be sufficient (as is done in block.module).

Steps to reproduce issue:
Download the sky 7.x-1.0 theme. Clear all caches, and the menu_mask variable. Try to load any page... boom!

bfroehle’s picture

Status: Active » Needs review
FileSize
570 bytes

The attached patch, which adds check_plain() around $theme->info['name'] fixes this issue for me (except that it takes both applying the patch and clearing the caches and some menu variables to take affect).

This is probably the most minimally intrusive way to solve the problem. This patch works because check_plain(NULL) returns an empty string (''), which can then be inserted into the NOT NULL database field.

bfroehle’s picture

Heine’s picture

Status: Needs review » Needs work

Why would it need to be escaped? All you (IMO) do is abuse check_plain so it returns an empty string. A ternary check would be better. Alternatively, validate the entire .info before.

bfroehle’s picture

Heine: That's true, but it's no different that how things are dealt with in block_menu() of block.module, for example. If we go with a ternary check here, I suggest we should do something similar there.

I'm done working on this issue, so hopefully somebody else can jump in here.

truls1502’s picture

I have done the patch, but I still got problems same olamaekle. I got the message below:
"Notice: Undefined index: name in block_menu() (line 147 of /home/signwo/tester/d7/modules/block/block.module).
Notice: Undefined index: name in block_menu() (line 166 of /home/signwo/tester/d7/modules/block/block.module).
Notice: Undefined index: name in system_menu() (line 641 of /home/signwo/tester/d7/modules/system/system.module)."

I am wondering about I need to download the Sky-theme to get it to work, or there is another solution?

bfroehle’s picture

Status: Needs work » Needs review
FileSize
1.15 KB

I know I said I was done working on this issue, but I wrote up this patch earlier (and discarded it in favor of the shorter patch in #33).

This implements .info file validation for the 'name' (must be non-empty) and 'description' (must be set) fields. Did not validate for 'core', as 6.x modules didn't set this and we want to show admin page messages about upgrading out-of-date modules.

Tor Arne Thune’s picture

FileSize
176.95 KB

[Ignore, double post]

Tor Arne Thune’s picture

FileSize
176.95 KB

So, following up on my post in #14. I have tried to install a new installation of Drupal 7.0 on the same shared host as in #14 (but on different accounts). The bug was reproducible.
Server information:

  • Linux 2.6.18
  • Apache 2.2.13
  • MySQL 5.0.91-log
  • PHP 5.2.14

Steps used to reproduce bug:

  1. Set up database.
  2. Untarred drupal-7.0.tar.gz.
  3. Moved all the content (including .htaccess) of the newly created drupal-7.0 directory to the hosting account root (up one level).
  4. Moved sites/default/default.settings.php to sites/default/settings.php.
  5. Created files directory in sites/default.
  6. Changed permissions on sites/default, sites/default/settings.php and sites/default/files (a+w).
  7. Pointed my browser to the base URL of the site to start the installation.

The installation went fine up until this error appeared when the installer was creating tables:

PDOException: 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 ') ORDER BY fit DESC LIMIT 0, 1' at line 1: SELECT * FROM {menu_router} WHERE path IN () ORDER BY fit DESC LIMIT 0, 1; Array ( ) in menu_get_item() (line 443 of /home/content/32/5671032/html/includes/menu.inc).

32 tables have been created. See MySQLTablesAfterError.png. There is no watchdog table.

bfroehle’s picture

1V: Was that a fresh copy of drupal-7.0 without any other themes or modules present?

Tor Arne Thune’s picture

Yes, fresh copy. Straight from drupal.org.

bfroehle’s picture

FileSize
318 bytes

1V: Try applying the patch attached to this issue and starting over -- it should help give a clearer picture of where the menu building process is dying.

Stevel’s picture

It seems like a major WTF that you need to specify "description =" , but can leave the description empty after that. I would suggest either make it required, or completely optional, but not something in between.

bfroehle’s picture

Stevel: The reality is the earlier 'description' => '' that gets added what is pulled from the info file will make the check for 'description' be pointless anyway.

Tor Arne Thune’s picture

Thanks, bfroehle. I dropped the database, deleted the files and started over, using the same steps as in #40, but also patched includes/menu.inc with your patch. I was able to reproduce the bug successfully.

Tor Arne Thune’s picture

So, the problem for me was that I didn't have cookies enabled. Or rather, more specific, that my proxy server was crunching all the incoming cookies. I was not able to reproduce this bug with this proxy feature disabled.

See #791004: Installer does not warn the user that cookies must be enabled with the correct cookie domain (and fails when they aren't).

bfroehle’s picture

XelnagaSVK’s picture

Hi, i am absolutly new to drupal and i am not well-experienced programmator, i know some basics of PHP, MySQL,CSS and complete HTML.. i have same problem as 1V does. I tried to download GIT and to apply patch but it is just too much for me... can you give me some advice how can i do that ? or can you just upload already patched files here pls ?

catch’s picture

Try http://drupal.org/patch for instructions.

XelnagaSVK’s picture

Ok so i downloaded UnxUtils and opened file called PATCH in UnxUtils\usr\local\wbin directory. The problem is that i write cd something or patch something and it does not work at all O_o i hit enter and it just skipped one line... Anyway, i am installing completly fresh copy from drupal.org and in step 5 [Profile installation] i get this error while it is creating tables or whatever >

    * Notice: Undefined variable: site_name in include() (line 33 of /home/free/tym.sk/h/horskevydry/root/www/themes/bartik/templates/maintenance-page.tpl.php).
    * Notice: Trying to get property of non-object in drupal_get_user_timezone() (line 2069 of /home/free/tym.sk/h/horskevydry/root/www/includes/bootstrap.inc).
    * Notice: Trying to get property of non-object in drupal_get_user_timezone() (line 2069 of /home/free/tym.sk/h/horskevydry/root/www/includes/bootstrap.inc).

And it stopes around number of 12 and another error apear

An AJAX HTTP error occurred. HTTP Result Code: 500 Debugging information follows. Path: http://horskevydry.tym.sk/install.php?profile=standard&locale=sk&id=1&op=do StatusText: Service unavailable (with message) ResponseText: PDOException: 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 ') ORDER BY fit DESC LIMIT 0, 1' at line 1: SELECT * FROM {menu_router} WHERE path IN () ORDER BY fit DESC LIMIT 0, 1; Array ( ) in menu_get_item() (line 443 of /home/free/tym.sk/h/horskevydry/root/www/includes/menu.inc).

I am posting this "second part" just to make sure, if that patch helps me... and i already switched proxy server off. So the first question is : Will this patch help me ? or is my problem elsewhere ? and the second is : What do i have to do with that UnxUtils to make that patch running ?

i am really a newbie to this things so dont blame me pls ^^

------------------ EDIT: Ok, i read through the very first posts and i solved the problem, i apologize for taking your time .] Anyway I will work on my patching skills so i can help out a bit :D Thanks

lionic’s picture

Hi,
I'm facing the same issue.

PDOException: 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 ') ORDER BY fit DESC LIMIT 0, 1' at line 1: SELECT * FROM {menu_router} WHERE path IN () ORDER BY fit DESC LIMIT 0, 1; Array ( ) in menu_get_item() (line 443 of /home/xxxx/www/prototype/includes/menu.inc).

I tried applying the patch that bfroehle suggested but i don't seem to get any error there. Also I don't see the watchdog table in the database. It might have failed before that.

My Installation is on a virtual host using Webmin. I'm using the latest drupal 7 download and the standard install procedure. I use CentOS 5.3, PHP 5.3.
I have cookies enabled on my web browser

I see the following errors in the logs although i'm not sure how significant this information is

PHP Notice:  Undefined offset: 0 in /home/xxxx/www/prototype/includes/errors.inc on line 279, referer: http://prototype.xxxx.org/install.php?profile=standard&locale=en
PHP Notice:  Undefined index: file in /home/xxxx/www/prototype/includes/errors.inc on line 84, referer: http://prototype.xxxx.org/install.php?profile=standard&locale=en
PHP Notice:  Undefined index: line in /home/xxxx/www/prototype/includes/errors.inc on line 85, referer: http://prototype.xxxx.org/install.php?profile=standard&locale=en

The variable table shows the following entries

 	cron_key	s:43:"YQPv0j2au7hUNMgS-i-ekv3fHXfslTV011rh_lG8l7E";
 	drupal_private_key	s:43:"Y5rSqanB6PYWGiVWK7F7d35VJ9cKa_b5RHd9vN6-Nu4";
 	install_current_batch	s:23:"install_profile_modules";
 	install_task	s:21:"install_system_module";
 	path_alias_whitelist	a:0:{}
 	theme_default	s:6:"bartik";

Webmin shows me that the database has "32 tables containing 376 rows of data"

Another warning i keep getting throughout the installation process is this but i don't know if it is related in any way.

Warning: ini_set() [function.ini-set]: A session is active. You cannot change the session module's ini settings at this time in drupal_environment_initialize() (line 521 of /home/xxxx/www/prototype/includes/bootstrap.inc). 

Any suggestions?

Thanks

bfroehle’s picture

lionic: Try removing any contributed modules and themes you have installed. If that doesn't work, the root cause of your problem is likely #1026474: Menu system does not always get rebuilt when needed or similar.

lionic’s picture

Hi,

I tried putting in the menu_rebuild code right before the menu_masks variable was used in menu_get_ancestors. The above error did not come, but I got a page not found error instead when I access the website.

Is there any way I can figure out where the code might be failing silently that might be causing the {menu_router} error?

Thanks.

lionic’s picture

Hi,
It turned out that there was some permissions issue for the user on the database server because of which something was failing silently.
Once the permissions issue was resolved, i could install successfully.

Thanks bfroehle for helping out.
Regds

Phantom1’s picture

Ok... I installed 6.20 and 7.0

I had to do the following:
add this in the httpd.conf

<Directory "path">
AllowOverride All
</Directory>

And DO NOT change anything in other folders then /sites
( I commented line 521 in include/bootstrap.inc - as was sugested on another forum thread)

Jeff Burnz’s picture

Subscribing

bfroehle’s picture

I'm attempting to reset this issue so we can work on finalizing a fix for it.

There is an issue summary writeup in #32. Two different patches were proposed in #33 and #38, although both received some criticism.

Very briefly, the issue is that if a THEME.info file does not provide a 'name' attribute, the menu router generation SQL breaks by attempting to insert a NULL value into a NOT NULL column.

WD menu: PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column [error]
'title' cannot be null: INSERT INTO {menu_router} (path, load_functions,
to_arg_functions, access_callback, access_arguments, page_callback, page_arguments,
...

This can also occur if the theme provides a corrupted .info file -- see Sky 7.x-1.0, for example.
I've attached the simplest patch for this bug, namely one that sets $theme[$key]->info['name'] to $key if it is not already set. (In the cited example, $key here would be 'sky').

Steps to Reproduce:

drush dl sky-7.x-1.0
drush -y vdel menu_masks
drush cc all

Boom, site broken. (The deletion of the menu_masks variable is optional -- you can still see piles of error messages on clearing the cache even if you preserve that variable.)

Now apply the attached patch, run

drush cc all

and observe that everything works again.

bfroehle’s picture

Version: 7.x-dev » 8.x-dev
Issue tags: +Needs backport to D7
bfroehle’s picture

Ray8abit’s picture

Version: 8.x-dev » 7.0

PDOException: 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 ') ORDER BY fit DESC LIMIT 0, 1' at line 1: SELECT * FROM {menu_router} WHERE path IN () ORDER BY fit DESC LIMIT 0, 1; Array ( ) in menu_get_item() (line 443 of /data/25/2/21/46/2510046/user/2749407/htdocs/includes/menu.inc).

I seem to have the same problem I believe. I have worked through and been able to use several other fixes to get to this stage.

I am using Drupal 7, Network Solutions shared server hosting, MySQL client version: 5.0.89, UTF-8 Unicode (utf8).

Ray8abit’s picture

Maybe this can help, copied and pasted the errors first and then the log file below.

This MySQL server has been running for 9 days, 9 hours, 47 minutes and 46 seconds. It started up on Apr 08, 2011 at 12:28 PM.

Errors shown in database log.

Slow_queries 2,870 The number of queries that have taken more than long_query_time seconds.

Handler_read_rnd 604 M The number of requests to read a row based on a fixed position. This is high if you are doing a lot of queries that require sorting of the result. You probably have a lot of queries that require MySQL to scan whole tables or you have joins that don't use keys properly.

Handler_read_rnd_next 2,776.74 M The number of requests to read the next row in the data file. This is high if you are doing a lot of table scans. Generally this suggests that your tables are not properly indexed or that your queries are not written to take advantage of the indexes you have.

Qcache_lowmem_prunes 39 M The number of queries that have been removed from the cache to free up memory for caching new queries. This information can help you tune the query cache size. The query cache uses a least recently used (LRU) strategy to decide which queries to remove from the cache.

Created_tmp_disk_tables 4,510 k The number of temporary tables on disk created automatically by the server while executing statements. If Created_tmp_disk_tables is big, you may want to increase the tmp_table_size value to cause temporary tables to be memory-based instead of disk-based.

Select_full_join 425 k The number of joins that do not use indexes. If this value is not 0, you should carefully check the indexes of your tables.

Select_range_check 36 k The number of joins without keys that check for key usage after each row. (If this is not 0, you should carefully check the indexes of your tables.)

Sort_merge_passes 32 k The number of merge passes the sort algorithm has had to do. If this value is large, you should consider increasing the value of the sort_buffer_size system variable

Opened_tables 12 M The number of tables that have been opened. If opened tables is big, your table cache value is probably too small.

Table_locks_waited 41 k The number of times that a table lock could not be acquired immediately and a wait was needed. If this is high, and you have performance problems, you should first optimize your queries, and then either split your table or tables or use replication

The Above is the errors, I am including the full log.

Server traffic: These tables show the network traffic statistics of this MySQL server since its startup.

Traffic ø per hour
Received 3,820 MiB 17 MiB
Sent 3,288 MiB 15 MiB
Total 7,108 MiB 31 MiB
Connections ø per hour %
max. concurrent connections 297 --- ---
Failed attempts 380 k 1,681.48 3.00%
Aborted 13 k 59.73 0.11%
Total 13 M 56.03 k 100.00%
Query statistics: Since its startup, 212,426,180 queries have been sent to the server.

Total ø per hour ø per minute ø per second
212 M 940.79 k 15.68 k 261.33
Query type ø per hour %
admin commands 1,375 k 6,090.89 0.69%
alter db 13 0.00 k 0.00%
alter table 9,798 43.39 0.00%
analyze 833 k 3,689.65 0.42%
backup table 0 0.00 0.00%
begin 2,325 k 10.30 k 1.16%
call procedure 954 4.23 0.00%
change db 13 M 57.76 k 6.53%
change master 0 0.00 0.00%
check 0 0.00 0.00%
checksum 0 0.00 0.00%
commit 1,516 k 6,712.46 0.76%
create db 319 1.41 0.00%
create function 0 0.00 0.00%
create index 19 0.00 k 0.00%
create table 70 k 308.89 0.03%
create user 0 0.00 0.00%
delete 3,367 k 14.91 k 1.69%
delete multi 273 1.21 0.00%
do 0 0.00 0.00%
drop db 100 0.00 k 0.00%
drop function 0 0.00 0.00%
drop index 0 0.00 0.00%
drop table 4,705 20.84 0.00%
drop user 0 0.00 0.00%
flush 403 1.78 0.00%
grant 2 0.00 k 0.00%
ha close 0 0.00 0.00%
ha open 0 0.00 0.00%
ha read 0 0.00 0.00%
help 0 0.00 0.00%
insert 3,867 k 17.13 k 1.94%
insert select 6,406 28.37 0.00%
kill 5 0.00 k 0.00%
load 3 0.00 k 0.00%
load master data 0 0.00 0.00%
load master table 0 0.00 0.00%
lock tables 15 k 64.56 0.01%
optimize 1,251 5.54 0.00%
preload keys 0 0.00 0.00%
purge 0 0.00 0.00%
purge before date 0 0.00 0.00%
rename table 182 0.00 k 0.00%
repair 42 0.00 k 0.00%
replace 344 k 1,524.24 0.17%
replace select 41 0.00 k 0.00%
reset 0 0.00 0.00%
restore table 0 0.00 0.00%
revoke 0 0.00 0.00%
revoke all 0 0.00 0.00%
Query type ø per hour %
rollback 194 0.00 k 0.00%
savepoint 0 0.00 0.00%
select 59 M 261.17 k 29.52%
set option 8,013 k 35.49 k 4.01%
show binlog events 0 0.00 0.00%
show binlogs 1,251 5.54 0.00%
show charsets 14 k 60.78 0.01%
show collations 19 k 81.94 0.01%
show column types 0 0.00 0.00%
show create db 4 0.00 k 0.00%
show create table 224 k 993.24 0.11%
show databases 134 0.00 k 0.00%
show errors 0 0.00 0.00%
show fields 381 k 1,687.11 0.19%
show grants 4,170 18.47 0.00%
show innodb status 0 0.00 0.00%
show keys 7,886 34.93 0.00%
show logs 0 0.00 0.00%
show master status 10 0.00 k 0.00%
show ndb status 0 0.00 0.00%
show new master 0 0.00 0.00%
show open tables 0 0.00 0.00%
show privileges 0 0.00 0.00%
show processlist 3,280 14.53 0.00%
show slave hosts 0 0.00 0.00%
show slave status 10 0.00 k 0.00%
show status 3,855 17.07 0.00%
show storage engines 118 0.00 k 0.00%
show tables 449 k 1,988.47 0.22%
show triggers 213 k 945.01 0.11%
show variables 68 k 302.27 0.03%
show warnings 1,306 5.78 0.00%
slave start 0 0.00 0.00%
slave stop 0 0.00 0.00%
stmt close 20 0.00 k 0.00%
stmt execute 35 0.00 k 0.00%
stmt fetch 0 0.00 0.00%
stmt prepare 39 0.00 k 0.00%
stmt reset 20 0.00 k 0.00%
stmt send long data 0 0.00 0.00%
truncate 1,280 5.67 0.00%
unlock tables 15 k 66.76 0.01%
update 4,553 k 20.16 k 2.28%
update multi 57 k 251.71 0.03%
xa commit 0 0.00 0.00%
xa end 0 0.00 0.00%
xa prepare 0 0.00 0.00%
xa recover 0 0.00 0.00%
xa rollback 0 0.00 0.00%
xa start 0 0.00 0.00%
Begin SQL query
Variable Value Description
Flush_commands 1 The number of executed FLUSH statements.
Last_query_cost 0 The total cost of the last compiled query as computed by the query optimizer. Useful for comparing the cost of different query plans for the same query. The default value of 0 means that no query has been compiled yet.
Slow_queries 2,870 The number of queries that have taken more than long_query_time seconds.
Begin SSL
Variable Value Description
Ssl_accept_renegotiates 0
Ssl_accepts 0
Ssl_callback_cache_hits 0
Ssl_cipher
Ssl_cipher_list
Ssl_client_connects 0
Ssl_connect_renegotiates 0
Ssl_ctx_verify_depth 0
Ssl_ctx_verify_mode 0
Ssl_default_timeout 0
Ssl_finished_accepts 0
Ssl_finished_connects 0
Ssl_session_cache_hits 0
Ssl_session_cache_misses 0
Ssl_session_cache_mode NONE
Ssl_session_cache_overflows 0
Ssl_session_cache_size 0
Ssl_session_cache_timeouts 0
Ssl_sessions_reused 0
Ssl_used_session_cache_entries 0
Ssl_verify_depth 0
Ssl_verify_mode 0
Ssl_version
Begin Handler
Variable Value Description
Handler_commit 0 The number of internal COMMIT statements.
Handler_delete 1,563 k The number of times a row was deleted from a table.
Handler_discover 0 The MySQL server can ask the NDB Cluster storage engine if it knows about a table with a given name. This is called discovery. Handler_discover indicates the number of time tables have been discovered.
Handler_prepare 0
Handler_read_first 6,458 k The number of times the first entry was read from an index. If this is high, it suggests that the server is doing a lot of full index scans; for example, SELECT col1 FROM foo, assuming that col1 is indexed.
Handler_read_key 2,530.10 M The number of requests to read a row based on a key. If this is high, it is a good indication that your queries and tables are properly indexed.
Handler_read_next 1,289 M The number of requests to read the next row in key order. This is incremented if you are querying an index column with a range constraint or if you are doing an index scan.
Handler_read_prev 234 M The number of requests to read the previous row in key order. This read method is mainly used to optimize ORDER BY ... DESC.
Handler_read_rnd 604 M The number of requests to read a row based on a fixed position. This is high if you are doing a lot of queries that require sorting of the result. You probably have a lot of queries that require MySQL to scan whole tables or you have joins that don't use keys properly.
Handler_read_rnd_next 2,776.74 M The number of requests to read the next row in the data file. This is high if you are doing a lot of table scans. Generally this suggests that your tables are not properly indexed or that your queries are not written to take advantage of the indexes you have.
Handler_rollback 0 The number of internal ROLLBACK statements.
Handler_savepoint 0
Handler_savepoint_rollback 0
Handler_update 392 M The number of requests to update a row in a table.
Handler_write 595 M The number of requests to insert a row in a table.
Begin Query cache
Variable Value Description
Flush query cache
Qcache_free_blocks 1,416 The number of free memory blocks in query cache.
Qcache_free_memory 4,566 k The amount of free memory for query cache.
Qcache_hits 101 M The number of cache hits.
Qcache_inserts 52 M The number of queries added to the cache.
Qcache_lowmem_prunes 39 M The number of queries that have been removed from the cache to free up memory for caching new queries. This information can help you tune the query cache size. The query cache uses a least recently used (LRU) strategy to decide which queries to remove from the cache.
Qcache_not_cached 7,602 k The number of non-cached queries (not cachable, or not cached due to the query_cache_type setting).
Qcache_queries_in_cache 6,471 The number of queries registered in the cache.
Qcache_total_blocks 18 k The total number of blocks in the query cache.
Begin Threads
Variable Value Description
Show processes
Slow_launch_threads 0 The number of threads that have taken more than slow_launch_time seconds to create.
Threads_cached 1 The number of threads in the thread cache. The cache hit rate can be calculated as Threads_created/Connections. If this value is red you should raise your thread_cache_size.
Threads_connected 17 The number of currently open connections.
Threads_created 525 k The number of threads created to handle connections. If Threads_created is big, you may want to increase the thread_cache_size value. (Normally this doesn't give a notable performance improvement if you have a good thread implementation.)
Threads_running 5 The number of threads that are not sleeping.
Threads_cache_hitrate_% 95.85 %
Begin Binary log
Variable Value Description

Binlog_cache_disk_use 0 The number of transactions that used the temporary binary log cache but that exceeded the value of binlog_cache_size and used a temporary file to store statements from the transaction.
Binlog_cache_use 0 The number of transactions that used the temporary binary log cache.
Begin Temporary data
Variable Value Description
Created_tmp_disk_tables 4,510 k The number of temporary tables on disk created automatically by the server while executing statements. If Created_tmp_disk_tables is big, you may want to increase the tmp_table_size value to cause temporary tables to be memory-based instead of disk-based.
Created_tmp_files 63 k How many temporary files mysqld has created.
Created_tmp_tables 7,941 k The number of in-memory temporary tables created automatically by the server while executing statements.
Begin Delayed inserts
Variable Value Description
Delayed_errors 0 The number of rows written with INSERT DELAYED for which some error occurred (probably duplicate key).
Delayed_insert_threads 0 The number of INSERT DELAYED handler threads in use. Every different table on which one uses INSERT DELAYED gets its own thread.
Delayed_writes 470 The number of INSERT DELAYED rows written.
Not_flushed_delayed_rows 0 The number of rows waiting to be written in INSERT DELAYED queues.
Begin Key cache
Variable Value Description

Key_blocks_not_flushed 0 The number of key blocks in the key cache that have changed but haven't yet been flushed to disk. It used to be known as Not_flushed_key_blocks.
Key_blocks_unused 329 k The number of unused blocks in the key cache. You can use this value to determine how much of the key cache is in use.
Key_blocks_used 65 k The number of used blocks in the key cache. This value is a high-water mark that indicates the maximum number of blocks that have ever been in use at one time.
Key_read_requests 12.44 G The number of requests to read a key block from the cache.
Key_reads 75 M The number of physical reads of a key block from disk. If Key_reads is big, then your key_buffer_size value is probably too small. The cache miss rate can be calculated as Key_reads/Key_read_requests.
Key_write_requests 56 M The number of requests to write a key block to the cache.
Key_writes 17 M The number of physical writes of a key block to disk.
Key_buffer_fraction_% 16.25 %
Key_write_ratio_% 31.12 %
Key_read_ratio_% 0.60 %
Begin Joins
Variable Value Description
Select_full_join 425 k The number of joins that do not use indexes. If this value is not 0, you should carefully check the indexes of your tables.
Select_full_range_join 17 k The number of joins that used a range search on a reference table.
Select_range 5,919 k The number of joins that used ranges on the first table. (It's normally not critical even if this is big.)
Select_range_check 36 k The number of joins without keys that check for key usage after each row. (If this is not 0, you should carefully check the indexes of your tables.)
Select_scan 14 M The number of joins that did a full scan of the first table.
Begin Replication
Variable Value Description
Show slave hosts Show slave status
Rpl_status NULL The status of failsafe replication (not yet implemented).
Slave_open_temp_tables 0 The number of temporary tables currently open by the slave SQL thread.
Slave_retried_transactions 0 Total (since startup) number of times the replication slave SQL thread has retried transactions.
Slave_running OFF This is ON if this server is a slave that is connected to a master.
Begin Sorting
Variable Value Description
Sort_merge_passes 32 k The number of merge passes the sort algorithm has had to do. If this value is large, you should consider increasing the value of the sort_buffer_size system variable.
Sort_range 2,775 k The number of sorts that were done with ranges.
Sort_rows 1,896 M The number of sorted rows.
Sort_scan 8,806 k The number of sorts that were done by scanning the table.
Begin Tables
Variable Value Description
Flush (close) all tables Show open tables
Open_tables 512 The number of tables that are open.
Opened_tables 12 M The number of tables that have been opened. If opened tables is big, your table cache value is probably too small.
Table_locks_immediate 89 M The number of times that a table lock was acquired immediately.
Table_locks_waited 41 k The number of times that a table lock could not be acquired immediately and a wait was needed. If this is high, and you have performance problems, you should first optimize your queries, and then either split your table or tables or use replication.
Begin Transaction coordinator
Variable Value Description
Tc_log_max_pages_used 0
Tc_log_page_size 0
Tc_log_page_waits 0
Begin
Variable Value Description
Compression OFF
Open_files 1,010 The number of files that are open.
Open_streams 0 The number of streams that are open (used mainly for logging).
Prepared_stmt_count 0
Queries 212 M

bfroehle’s picture

Version: 7.0 » 8.x-dev

@Ray8abit: Sorry to hear you are having issues. For such long posts of information, it is generally courteous to attach that information in a text file rather than just paste it in the editor window. Unfortunately, the information provided is not sufficient to diagnose your problem. Have you tried applying the patch in #58? If that doesn't address your problem, please open a new issue as this issue is for one specific cause of the symptom you describe.

For an issue summary and the latest patch, see #619542-58: Malformed theme .info files break menu_router generation.

Ray8abit’s picture

My apologies

abaddon’s picture

not sure if this was the cause, but i got the same error on an install of 7.0 so i restored the install folder to the exact same environment (i have a custom restore script), and i _enabled javascript and cookies_ for the site i was installing and it worked this time without any error. Im using some addons to disable js/cookies selectively and i forgot to allow the d7 site. I know d6 had some similar problems on the install if js or cookies are disabled

catch’s picture

Status: Needs review » Needs work

Typo in the patch "resonable".

Is this worth writing a test for?

#898634: install_drupal(): call to install_display_output() results in SQL syntax error contains a change to menu_get_item() that may allow the menu system to recover from this state but I've not tested that with this - if that's sufficient, I'd be fine with having the exception thrown (or making that .info key not required in D8).

mgifford’s picture

I'm just confirming the note in #51 of an notice error on line 33 of /themes/bartik/templates/maintenance-page.tpl.php

Notice errors should be squished as they are annoying.

bfroehle’s picture

Status: Needs work » Needs review
FileSize
740 bytes

I posted an issue summary and have revised the comments in the patch as directed by catch in #66.

The change in #898634: install_drupal(): call to install_display_output() results in SQL syntax error won't help this issue, as the PDO Exception is thrown when we are populating the {menu_router} table.

Does this need a test? Ehh, I don't know.

catch’s picture

The explicit reference to this issue can be removed from the comment, git blame covers that. Sorry I missed that first pass.

I don't think this is worth testing so RTBC apart from removing the link.

bfroehle’s picture

catch: I added the link in the last iteration of this. The link points to Writing .info files, which seems appropriate.

catch’s picture

In that case it should at least be an @see then.

If we can't make this optional for 7.x, then we should log to watchdog when this has to be corrected, I don't like the idea of silently passing here if the bug is in contrib themes.

dcrocks’s picture

It seems strange to me that Drupal would not enforce required fields. This patch prevents an error msg but what other unexpected problems might arise? Why not treat these the same way as themes that do not have a 'content' region and don't let them get enabled?

catch’s picture

Status: Needs review » Needs work

@drocks that sounds like a good plan to me.

bfroehle’s picture

This plan of enforcing the required fields isn't really possible without #1067408: Themes do not have an installation status. It's not enough to prevent the theme from being enabled --- the issue is that the mere presence of the malformed .info file in a theme directory breaks Drupal.

What's the current policy regarding these types of changes? Can we agree on a small, commented hack (like #68 or a different solution) for inclusion now (and backport to D7) before blocking the issue on a major theme status change (with no possibility of backport to D7)?

catch’s picture

Status: Needs work » Needs review

@bfoehle the closest to a policy is http://drupal.org/node/767608

I am personally very much in favour of committing commented hacks if it's a serious issue with no clear fix - even if we open another major bug report (or keep this issue open) for a more comprehensive fix for D8. The current issue queue thresholds were put in place partly to allow that to happen (i.e. without adding hundreds of commented hacks to D8 that never get fixed properly).

Since a subtheme could do this, and subthemes don't need any kind of enabled status at all, preventing them being used doesn't look like an option indeed. We could really use a comment/@todo though so leaving at NW.

dcrocks’s picture

For module.info files the documentation says that the 'name' variable is only used for display purposes. Bur the theme.info docs don't say anything about about the allowed values of 'name'. And that value is used in a number of places in drupal. For example, the values in .info are used to populate the values stored in the system table record for a subtheme. Since none of the data in .info is validated in any way doesn't that leave drupal open to all kinds of weirdness, as shown here. The patch here will help if the 'name' value is omitted from a .info file bur not if it gets some arbitrary or conflicting setting. I guess what I am asking is, why does drupal trust some arbitrary user input such as .info['name'] over the actual theme 'name' stored in the system table?

dcrocks’s picture

A really simple hack would be to add a line like:

'name' => 'Name not provided in your .info file. Please correct'

to the theme info $defaults in system.module.

dcrocks’s picture

I did an extensive(but not exhaustive) search of drupal code to find where theme info['name'] is used and found 4 in system module and 3 in block.module. All of the use in block module was for display purposes. 2 of the 4 in system.module were for display. The documentation for drupal_parse_info_file says that the 'name' attribute is for display purposes for both modules and themes. Perhaps the problem here is inappropriate use of the info['name'] attribute.

catch’s picture

While the 'title' of a menu router item is only supposed to be used for display, I think dcrocks is along the right lines here.

Here's a look at a different way to fix this. Instead of setting title directly to $theme->info['name'];, it uses a title callback, then gets the theme name in there.

I tested this manually by removing the name key for Seven, and it removed the fatal error during menu_rebuild(), while meaning there are various notices about the missing key still (which is fine since it's required).

Adding a test theme just for this bug seems like far too much overhead, however it's easy to reproduce with core patches + the test bot. So three patches:

One that removes the theme key for Seven, this should completely blow up.

One that includes the fix and the broken .info, this should have some exceptions but not fatal errors.

And one that only includes the changes to system_menu().

This is still a hacky workaround until we have #1067408: Themes do not have an installation status but it localises the hack a bit more maybe.

Status: Needs review » Needs work

The last submitted patch, theme_name_broken.patch, failed testing.

dcrocks’s picture

I still have some angst as to the best way to fix this problem. The core problem is that there is no validation of .info problem contents, leading to issues like the one here with 'name'. I think there are more elsewhere in drupal. It seems like there are 2 approaches:
1) make sure these parameters always meet program expectations
2) make sure the program can handle any arbitrary value or non-value for these parameters
The 1st solution is more future proof. And it is not bad practice to assign defaults to required parameters. But it is bad practice to not inform the user that they have done something wrong. Setting a default for info['name'] such as 'Untitled', with documentation, would be an easy fix but by no means guarantee a problem free drupal installation. Nor does it address other possible values for info['name'], such as the name of an non-existent or already existent theme. The best fix, at least for the few required parameters in .info, would be to apply a reasonably thorough validation of those parameters. Otherwise the drupal community is going to solving these one malapropism at a time.

catch’s picture

Status: Needs work » Needs review

Moving back to needs review, looks like the test bot doesn't like three patches at once.

bfroehle’s picture

I'm ambivalent on the green patch in #79.

On the one hand it changes a PDOException into a regular PHP warning and keeps Drupal functional (but with warnings, as it should). Notice that it actually allows Drupal to be installed unlike the test-only patch which breaks the installation even.

On the other hand it adds extra complexity with a questionably needed callback function.

catch’s picture

Yeah I agree with #83, I'm not happy about that patch, I would like whatever we commit to throw noisy warnings though (although not quite as noisy as unrecoverable fatal errors).

dcrocks’s picture

The included patch forces a default info['name'] value and marks the theme as incompatible so that it won't be enabled, plus provides a clue as to the actual error. This is not the best solution but could provide a model for other errors in the .info file. The patch is for drupal 8.x but can't be a straight backport to 7.x because of differences in the files. I only did simple testing and I hope someone else can see if the other errors in this issue still show up.

dcrocks’s picture

Please ignore above patch, dropped a line. fixed here.

dcrocks’s picture

The above patch might actually work for 7.x but I generated a separate one anyways.

dcrocks’s picture

Assuming #86 is acceptable I'd like to add a couple more changes.
change the text color of the 'incompatible' div to red
change handling of 'no content region' error msg to something more applicable and make it an 'incompatible_info' error
change it so any of these 'incompatible' error themes have a name prefixed with ERROR, then the theme name
fins a better way to indicate the actual error
Handle more 'name' type errors, e.g., duplicate names

dcrocks’s picture

I've spent some time looking at how errors in .info are(not) handled and I just realized I don't know how to handle 1 case in particular: the admin modifies the .info file of the current default theme and introduces errors. What happens if the name property is dropped from the file? Is there an existing policy for this?

dcrocks’s picture

Not much discussion here. But after looking at what is needed to 'nicely' handle theme .info file errors and how drupal has treated similar errors in other places just maybe this should be closed as working as designed. Drupal seems to prefer some errors be allowed as long as their cause is fairly obvious and adding error management code might be burdensome. In this case the index errors are easily decoded and fixed. What does anyone think about this?

ps. The fixes I provided were certainly unpolished and I wouldn't want anyone to consider them. But the more I 'improved' them, the bigger they got.

catch’s picture

I'd be fine with #86/87 - either with the requirements hunk, or even just the default value. I don't think we need to deal with themes that have the key removed, that seems much more unikely.

We do in general like to allow errors to fall through, but ones that completely trash sites and are hard to recover from are a bit of a different category from just getting a notice or warning (or fatal errors that don't leave the db inconsistent). We generally have been careful to not allow things like enabling 6.x modules on 7.x sites, even if that shouldn't happen in normal usage, for the same reasons (although this is currently broken - but that's a critical bug).

dawehner’s picture

There seems to be no place yet where there is a test theme somewhere.

It would probably make sense to add a broken test theme to fix this behavior

catch’s picture

I think there's some in /themes, but

#953336: Contributed modules are not able to test theme-related functionality aims to allow them to be included with modules.

dcrocks’s picture

I would like to do some additional changes to #86. For one, it doesn't handle multiple errors. It also doesn't look like a normal drupal error message(no box or background). And I think it would be more drupal like to have the error messages on top of the theme display than on the bottom. If people are willing, I can put more time into it.

Ps. I tried to experiment with other possible errors(eg. duplicate name) in the .info file and though strange things happened, there weren't any exception messages during simple testing. So I think they might be left for other issues.

PS there are theme test files under modules/simpletest/tests

dcrocks’s picture

Got distracted but almost ready. Have a question. Current logic tests only disabled themes for .info error. But nothing prevents someone from modifying an enabled theme .info file, even the current default theme. Should tests be extended to all, or at least all but default, themes?

dcrocks’s picture

FileSize
312.79 KB

Attached is a screenshot for comments. I'm concerned I'm using appropriate wording. I added a drupal message to the top of the appearance page because I think that is standard drupal practice. Please let me know what you think before I finalize the code.

dcrocks’s picture

Status: Needs review » Needs work

Changing status until further comment. Also, if I should test for more errors.

dcrocks’s picture

If someone puts 'name =' followed by blanks in their .info file, the logic scans multiple lines until it reaches a non-blank character, and then scans to the end of that line to assign a value to the name key. A common result is the description key/value pair becoming the name of the theme. No way to test for this error, but it might be helpful if the default value for the description keyword be 'no description' rather than ''. Thoughts?

dcrocks’s picture

FileSize
313.83 KB

Here is my latest attempt with a test added for missing base themes. Please provide input on my message text.

dcrocks’s picture

Status: Needs work » Needs review
FileSize
5.96 KB
254.03 KB

No response, so maybe a patch would help. To summarize:

The policy on errors in a theme's .info file has mainly been to let any errors fall thru and what happens, happens. There are currently 2 exceptions to that, core and php compatibility. But several other .info file errors have shown to result in serious consequences and drupal failure. So I have built a patch that tests for these other errors, pushes a message, and prevents the theme from being enabled. The changes are:
0) The code allows for multiple errors on multiple themes.
1) Add a default value for the name keyword, '???????'. I think a string like this is more likely to catch the eye than a text string , e.g., 'no name'. Then stack an error message.
2) Changed the default value for description to 'No description' from ''. This is more informative and sometimes give a clue to the weird things that can happen when scanning a bad .info file. A user could still have an empty description be specifying description = ''
3) Gave 'no content region' error its own error message instead of 'incomaptible'.
4) Added a test where a subtheme specifies a base theme that doesn't exist. Stack an error message if so.
5) If any errors exist, do a drupal_set_message so that a message appears at the top of the appearance page, which I think is standard drupal practice.
6) Added an 'invisible' h2 element at the top of the error display div for accessibility purposes.
7) Changed theme info error div to a box with styling matching drupal error messages.

I've tested the patch on a current 8.x dev. A sample image is provided. It would be simple to backport to D7.
Please critique the code and message text

dcrocks’s picture

Title: Malformed theme .info files break menu_router generation » Detect and report critical errors in theme .info file

Can anyone review? Changed the title to reflect the patch.

dcrocks’s picture

Status: Needs review » Needs work

Has a bug. Will try to fix soon.

dcrocks’s picture

Have fix but was going to wait on #22336: Move all core Drupal files under a /core folder to improve usability and upgrades. Even though no one is paying much attention, is there support for adding tests for page_top and page_bottom regions?
This whole thing is about what have to be considered 'user' errors rather than 'drupal' errors. But they can lead to critical errors in a drupal implementation, or unexpected behaviors, whose cause might not be immediately obvious. If these things can be caught and flagged for the user it might make drupal a little friendlier.

dcrocks’s picture

It would be easy to force the existence of regions content, page_top, page_bottom, and help in every theme by default. Is there any interest in doing this? Or is this a philosophical issue?

bfroehle’s picture

Where do we draw the line at too much error checking?

The original issue was about one specific instance where Drupal itself throws a PDOException error just by having an invalid theme.info file sitting in the directory. This is a pretty major error since it'll cripple your Drupal site without much indication as to why.

Since then it has morphed into a lot more error checking -- but are these errors something core needs to check? Why not just toss them in the Theme Developer module?

Personally I'd just like to see the one-liner fix in #68 (which easily hides the error) or the 5 liner in #79 (which turns it into a PHP warning).

dcrocks’s picture

Well, what is Drupal's philosophy here? These are 'user' errors, but does Drupal want to be user friendly, or should there just be a 'bath at your own risk' sign? If Drupal has requirements they should be enforced, and not be a learning challenge to users.
I've come across this attitude before to just let user errors fall through until they figure it out. Don't agree with it but won't fight the church. Someone else needs to put in a nickel on this.

dcrocks’s picture

Status: Needs work » Needs review
FileSize
5.99 KB

Nothing here for a while. I am re-rolling my patch against new drupal. I'd like to point out that I've only added 2 new error tests. But I have changed the way they are displayed. The .png in #100 does look busy, but only because I wanted people to actually look at the messages and their presentation, and the fact that the patch will display multiple errors against multiple themes.
Again, I disagree with the drupal fumble your way to success philosophy. A short informative message is more educational and less exasperating.

catch’s picture

Status: Needs review » Needs work

I agree with bfroehle. If you want to do full validation of theme.info files then that could be tackled in a follow-up issue but it's not necessary to do that in order to fix the major bug here.

Also regardless of philosophy around error checking, for this to be backported to Drupal 7, it needs to be fixed in such a way that it doesn't add new strings (which in turn breaks translations).

dcrocks’s picture

Title: Detect and report critical errors in theme .info file » Malformed theme .info files break menu_router generation
Status: Needs work » Needs review
FileSize
481 bytes

Ok, here is the one liner. Restores issue title as well.

KrisBulman’s picture

KrisBulman’s picture

What's needed to move this forward?

oops, i see.. a review is needed :]

mgifford’s picture

Just stumbled onto this issue (again) after running into this error - #1015368: Notice: Undefined index: name in system_sort_modules_by_info_name()

So what does need to happen to handle this better in D8? I'll test the bot against it, but it seems like a pretty simple patch.

mgifford’s picture

podarok’s picture

Status: Needs review » Needs work

#109 looks good for me
possibly we can change

+++ b/core/modules/system/system.module
@@ -2472,6 +2472,7 @@ function _system_rebuild_theme_data() {
+    'name' => '???????',

+ 'name' => '???????',

into better one? more human-readable

dcrocks’s picture

Could make it "NAME MISSING". Any suggestions? This really should be done as the error makes drupal look ugly.

dcrocks’s picture

This has to be rerolled for current 8.x dev, which I will do if anyone actually wants it done.

amontero’s picture

Status: Needs work » Needs review
FileSize
492 bytes

My vote (and patch) is for a bit verbose "MISSING THEME NAME".

David_Rothstein’s picture

Priority: Major » Normal

This is an important issue, but I don't believe it's a major bug (see http://drupal.org/node/45111 and http://drupal.org/node/1181250). Specifically, if it only occurs when a theme has a malformed .info file, then the actual serious bug is with the theme... the best Drupal core can do is protect against it a bit better, but that's not really a serious problem in Drupal core itself.

If you disagree and feel this must still be marked major, please provide a very specific justification and keep in mind that every major issue prevents other features that people are working hard on from getting into Drupal core, due to the issue queue threshold policy (until/unless #1810428: [Policy, no patch] Adjust major and critical task thresholds during code thaw is addressed, at any rate). Note that I am not singling out this issue for particular attention but rather (slowly) trying to go through the issue queue and do this in many places so that other features still have a chance to get into Drupal core soon without the thresholds getting in the way. I am trying my best to be impartial, and of course, just because an issue isn't marked "major" certainly doesn't mean it's unimportant to work on. You can follow my progress via the tag I've just added to this issue :)

bfroehle’s picture

From catch in #108:

Also regardless of philosophy around error checking, for this to be backported to Drupal 7, it needs to be fixed in such a way that it doesn't add new strings (which in turn breaks translations).

I don't think we need to worry about the translation of the proposed patch in #117, as it should never be shown to a user after the theme provides a valid .info file.

In response to David_Rothstein in #118, I disagree with your assessment that this is a "normal" bug. It think it does not quite fit the categorization of major because it does in fact render the whole system as unusable. The problem here is that a small omission or typographical error prevents Drupal from working entirely. It's certainly possible to shoot yourself in the foot via other means, but this bug is particularly bad because it produces no useful error message and gives the user (or developer) little indication of where to look for a resolution.

<rant>
Perhaps what is most frustrating about this issue is the fact that this simple, easy to fix bug has been unresolved for almost two years. It's not as if this is some complex, intractable problem. Instead the issue summary (and thanks David for updating it) provides a clear discussion of the issue, steps to reproduce, etc.

Several solutions have been proposed, any of which would fix this problem. Some had valid criticisms (addition of new strings, over-engineered, etc), but IMHO most could have been accepted without further revision. I don't have the energy to keep beating this into the ground. Please consider me unsubscribed from further discussion on this issue.
</rant>

David_Rothstein’s picture

I actually didn't update the issue summary; I think there's a bug on drupal.org which makes the revision history look like the last person who commented was the one who edited the issue summary too.

I looked this issue over and tend to agree very much with the idea of a simple fix for now, then deal with more generic validation as a follow-up. Honestly, even #33 seems fine to me; it's a hack but as was mentioned it already exists elsewhere in the codebase (in block_menu()) and it doesn't make sense to have two parts of the codebase treat this differently.

Or, since we know it's a hack (and presumably should remove it from block_menu() too?), #58 looks quite reasonable as well.

Either of these seem backportable to Drupal 7 also.

KrisBulman’s picture

catch’s picture

Yes #108 is pretty out of date now, webchick and David have been accepting minor translation breakage (especially something like this) into Drupal 7 for a while.

amontero’s picture

dcrocks’s picture

I know this is 3.5 years old now but if this is going to be painted over can something be added so the text stands out a bit? It can easily go unnoticed.

David_Rothstein’s picture

Issue tags: +major and critical issue threshold sweep

Sorry for the noise; I'm told that slashes in tags can break the autocomplete on drupal.org.

klonos’s picture

[comment removed - sorry for the noise]

klonos’s picture

[comment removed - sorry for the noise]

dcrocks’s picture

This does not look like the same problem. This one is easy to get around without the fix: find the theme who's .info file has an invalid NAME = specification. It looks like you should be looking over in the 'entity translation' module to research and report this error.

And no, #1022558: During install, "An AJAX HTTP error occurred. HTTP Result Code: 500..." is not a duplicate of this one. Or yours.

klonos’s picture

I think it's this: #1370900: Fatal Error: Cannot access empty property in /sites/all/modules/entity_translation/includes/translation.handler.inc

...I removed my previous comments to reduce the noise in this issue.

burningtime13’s picture

dcrocks’s picture

I checked to see if the behaviors have changed in the latest D8, and they have. If the 'name: ' value is not supplied at all, you still get numerous index error. If the 'name: ' value is specified but as a null there are no index errors. The theme can be enabled and even set as the default theme. However it won't appear in the 'admin/structure/blocks' page so block assignments can't be made/changed for the active theme. There are possibly/probably other problems. The fix in #117 would work, after a reroll. I didn't test the fix in #58 since I prefer to clearly indicate that an error has been made in the theme definition, rather than have drupal fix it for you.

amontero’s picture

amontero’s picture

Issue summary: View changes

Add issue summary.

mgifford’s picture

Status: Needs review » Needs work
drupalshrek’s picture

I recently upgraded to Drupal 7.26 and now, bang, I am getting this horrible error! It's slowing down my site (http://lingopolo.com/thai) dreadfully. The error messages are a page long. I don't think I changed anything else which would cause this. Is this the same issue?

And for me the most important: how do I fix it?!? Thanks.

PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'title' cannot be null: INSERT INTO {menu_router} (path, load_functions, to_arg_functions, access_callback, access_arguments, page_callback, page_arguments, delivery_callback, fit, number_parts, context, tab_parent, tab_root, title, title_callback, title_arguments, theme_callback, theme_arguments, type, description, position, weight, include_file) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5, :db_insert_placeholder_6, :db_insert_placeholder_7, :db_insert_placeholder_8, :db_insert_placeholder_9, :db_insert_placeholder_10, :db_insert_placeholder_11, :db_insert_placeholder_12, :db_insert_placeholder_13, :db_insert_placeholder_14, :db_insert_placeholder_15, :db_insert_placeholder_16, :db_insert_placeholder_17, :db_insert_placeholder_18, :db_insert_placeholder_19, :db_insert_placeholder_20, :db_insert_placeholder_21, :db_insert_placeholder_22), (:db_insert_placeholder_23, :db_insert_placeholder_24, :db_insert_placeholder_25, :db_insert_placeholder_26, :db_insert_placeholder_27, :db_insert_placeholder_28, :db_insert_placeholder_29, :db_insert_placeholder_30, :db_insert_placeholder_31, :db_insert_placeholder_32, :db_insert_placeholder_33, :db_insert_placeholder_34, :db_insert_placeholder_35, :db_insert_placeholder_36, :db_insert_placeholder_37, :db_insert_placeholder_38, :db_insert_placeholder_39, :db_insert_placeholder_40, :db_insert_placeholder_41, :db_insert_placeholder_42, :db_insert_placeholder_43, :db_insert_placeholder_44, :db_insert_placeholder_45), (:db_insert_placeholder_46, :db_insert_placeholder_47, :db_insert_placeholder_48, :db_insert_placeholder_49, :db_insert_placeholder_50, :db_insert_placeholder_51, :db_insert_placeholder_52, :db_insert_placeholder_53, :db_insert_placeholder_54, :db_insert_placeholder_55, :db_insert_placeholder_56, :db_insert_placeholder_57, :db_insert_placeholder_58, :db_insert_placeholder_59, :db_insert_placeholder_60, :db_insert_placeholder_61, :db_insert_placeholder_62, :db_insert_placeholder_63, :db_insert_placeholder_64, :db_insert_placeholder_65, :db_insert_placeholder_66, :db_insert_placeholder_67, :db_insert_placeholder_68), (:db_insert_placeholder_69, :db_insert_placeholder_70, :db_insert_placeholder_71, :db_insert_placeholder_72, :db_insert_placeholder_73, :db_insert_placeholder_74, :db_insert_placeholder_75, :db_insert_placeholder_76, :db_insert_placeholder_77, :db_insert_placeholder_78, :db_insert_placeholder_79, :db_insert_placeholder_80, :db_insert_placeholder_81, :db_insert_placeholder_82, :db_insert_placeholder_83, :db_insert_placeholder_84, :db_insert_placeholder_85, :db_insert_placeholder_86, :db_insert_placeholder_87, :db_insert_placeholder_88, :db_insert_placeholder_89, :db_insert_placeholder_90, :db_insert_placeholder_91), (:db_insert_placeholder_92, :db_insert_placeholder_93, :db_insert_placeholder_94, :db_insert_placeholder_95, :db_insert_placeholder_96, :db_insert_placeholder_97, :db_insert_placeholder_98, :db_insert_placeholder_99, :db_insert_placeholder_100, :db_insert_placeholder_101, :db_insert_placeholder_102, :db_insert_placeholder_103, :db_insert_placeholder_104, :db_insert_placeholder_105, :db_insert_placeholder_106, :db_insert_placeholder_107, :db_insert_placeholder_108, :db_insert_placeholder_109, :db_insert_placeholder_110, :db_insert_placeholder_111, :db_insert_placeholder_112, :db_insert_placeholder_113, :db_insert_placeholder_114), (:db_insert_placeholder_115, :db_insert_placeholder_116, :db_insert_placeholder_117, :db_insert_placeholder_118, :db_insert_placeholder_119, :db_insert_placeholder_120, :db_insert_placeholder_121, :db_insert_placeholder_122, :db_insert_placeholder_123, :db_insert_placeholder_124, :db_insert_placeholder_125, :db_insert_placeholder_126, :db_insert_placeholder_127, :db_insert_placeholder_128, :db_insert_placeholder_129, :db_insert_placeholder_130, :db_insert_placeholder_131, :db_insert_placeholder_132, :db_insert_placeholder_133, :db_insert_placeholder_134, :db_insert_placeholder_135, :db_insert_placeholder_136, :db_insert_placeholder_137), (:db_insert_placeholder_138, :db_insert_placeholder_139, :db_insert_placeholder_140, :db_insert_placeholder_141, :db_insert_placeholder_142, :db_insert_placeholder_143, :db_insert_placeholder_144, :db_insert_placeholder_145, :db_insert_placeholder_146, :db_insert_placeholder_147, :db_insert_placeholder_148, :db_insert_placeholder_149, :db_insert_placeholder_150, :db_insert_placeholder_151, :db_insert_placeholder_152, :db_insert_placeholder_153, :db_insert_placeholder_154, :db_insert_placeholder_155, :db_insert_placeholder_156, :db_insert_placeholder_157, :db_insert_placeholder_158, :db_insert_placeholder_159, :db_insert_placeholder_160), (:db_insert_placeholder_161, :db_insert_placeholder_162, :db_insert_placeholder_163, :db_insert_placeholder_164, :db_insert_placeholder_165, :db_insert_placeholder_166, :db_insert_placeholder_167, :db_insert_placeholder_168, :db_insert_placeholder_169, :db_insert_placeholder_170, :db_insert_placeholder_171, :db_insert_placeholder_172, :db_insert_placeholder_173, :db_insert_placeholder_174, :db_insert_placeholder_175, :db_insert_placeholder_176, :db_insert_placeholder_177, :db_insert_placeholder_178, :db_insert_placeholder_179, :db_insert_placeholder_180, :db_insert_placeholder_181, :db_insert_placeholder_182, :db_insert_placeholder_183), (:db_insert_placeholder_184, :db_insert_placeholder_185, :db_insert_placeholder_186, :db_insert_placeholder_187, :db_insert_placeholder_188, :db_insert_placeholder_189, :db_insert_placeholder_190, :db_insert_placeholder_191, :db_insert_placeholder_192, :db_insert_placeholder_193, :db_insert_placeholder_194, :db_insert_placeholder_195, :db_insert_placeholder_196, :db_insert_placeholder_197, :db_insert_placeholder_198, :db_insert_placeholder_199, :db_insert_placeholder_200, :db_insert_placeholder_201, :db_insert_placeholder_202, :db_insert_placeholder_203, :db_insert_placeholder_204, :db_insert_placeholder_205, :db_insert_placeholder_206), (:db_insert_placeholder_207, :db_insert_placeholder_208, :db_insert_placeholder_209, :db_insert_placeholder_210, :db_insert_placeholder_211, :db_insert_placeholder_212, :db_insert_placeholder_213, :db_insert_placeholder_214, :db_insert_placeholder_215, :db_insert_placeholder_216, :db_insert_placeholder_217, :db_insert_placeholder_218, :db_insert_placeholder_219, :db_insert_placeholder_220, :db_insert_placeholder_221, :db_insert_placeholder_222, :db_insert_placeholder_223, :db_insert_placeholder_224, :db_insert_placeholder_225, :db_insert_placeholder_226, :db_insert_placeholder_227, :db_insert_placeholder_228, :db_insert_placeholder_229), (:db_insert_placeholder_230, :db_insert_placeholder_231, :db_insert_placeholder_232, :db_insert_placeholder_233, :db_insert_placeholder_234, :db_insert_placeholder_235, :db_insert_placeholder_236, :db_insert_placeholder_237, :db_insert_placeholder_238, :db_insert_placeholder_239, :db_insert_placeholder_240, :db_insert_placeholder_241, :db_insert_placeholder_242, :db_insert_placeholder_243, :db_insert_placeholder_244, :db_insert_placeholder_245, :db_insert_placeholder_246, :db_insert_placeholder_247, :db_insert_placeholder_248, :db_insert_placeholder_249, :db_insert_placeholder_250, :db_insert_placeholder_251, :db_insert_placeholder_252), (:db_insert_placeholder_253, :db_insert_placeholder_254, :db_insert_placeholder_255, :db_insert_placeholder_256, :db_insert_placeholder_257, :db_insert_placeholder_258, :db_insert_placeholder_259, :db_insert_placeholder_260, :db_insert_placeholder_261, :db_insert_placeholder_262, :db_insert_placeholder_263, :db_insert_placeholder_264, :db_insert_placeholder_265, :db_insert_placeholder_266, :db_insert_placeholder_267, :db_insert_placeholder_268, :db_insert_placeholder_269, :db_insert_placeholder_270, :db_insert_placeholder_271, :db_insert_placeholder_272, :db_insert_placeholder_273, :db_insert_placeholder_274, :db_insert_placeholder_275), (:db_insert_placeholder_276, :db_insert_placeholder_277, :db_insert_placeholder_278, :db_insert_placeholder_279, :db_insert_placeholder_280, :db_insert_placeholder_281, :db_insert_placeholder_282, :db_insert_placeholder_283, :db_insert_placeholder_284, :db_insert_placeholder_285, :db_insert_placeholder_286, :db_insert_placeholder_287, :db_insert_placeholder_288, :db_insert_placeholder_289, :db_insert_placeholder_290, :db_insert_placeholder_291, :db_insert_placeholder_292, :db_insert_placeholder_293, :db_insert_placeholder_294, :db_insert_placeholder_295, :db_insert_placeholder_296, :db_insert_placeholder_297, :db_insert_placeholder_298), (:db_insert_placeholder_299, :db_insert_placeholder_300, :db_insert_placeholder_301, :db_insert_placeholder_302, :db_insert_placeholder_303, :db_insert_placeholder_304, :db_insert_placeholder_305, :db_insert_placeholder_306, :db_insert_placeholder_307, :db_insert_placeholder_308, :db_insert_placeholder_309, :db_insert_placeholder_310, :db_insert_placeholder_311, :db_insert_placeholder_312, :db_insert_placeholder_313, :db_insert_placeholder_314, :db_insert_placeholder_315, :db_insert_placeholder_316, :db_insert_placeholder_317, :db_insert_placeholder_318, :db_insert_placeholder_319, :db_insert_placeholder_320, :db_insert_placeholder_321), (:db_insert_placeholder_322, :db_insert_placeholder_323, :db_insert_placeholder_324, :db_insert_placeholder_325, :db_insert_placeholder_326, :db_insert_placeholder_327, :db_insert_placeholder_328, :db_insert_placeholder_329, :db_insert_placeholder_330, :db_insert_placeholder_331, :db_insert_placeholder_332, :db_insert_placeholder_333, :db_insert_placeholder_334, :db_insert_placeholder_335, :db_insert_placeholder_336, :db_insert_placeholder_337, :db_insert_placeholder_338, :db_insert_placeholder_339, :db_insert_placeholder_340, :db_insert_placeholder_341, :db_insert_placeholder_342, :db_insert_placeholder_343, :db_insert_placeholder_344), (:db_insert_placeholder_345, :db_insert_placeholder_346, :db_insert_placeholder_347, :db_insert_placeholder_348, :db_insert_placeholder_349, :db_insert_placeholder_350, :db_insert_placeholder_351, :db_insert_placeholder_352, :db_insert_placeholder_353, :db_insert_placeholder_354, :db_insert_placeholder_355, :db_insert_placeholder_356, :db_insert_placeholder_357, :db_insert_placeholder_358, :db_insert_placeholder_359, :db_insert_placeholder_360, :db_insert_placeholder_361, :db_insert_placeholder_362, :db_insert_placeholder_363, :db_insert_placeholder_364, :db_insert_placeholder_365, :db_insert_placeholder_366, :db_insert_placeholder_367), (:db_insert_placeholder_368, :db_insert_placeholder_369, :db_insert_placeholder_370, :db_insert_placeholder_371, :db_insert_placeholder_372, :db_insert_placeholder_373, :db_insert_placeholder_374, :db_insert_placeholder_375, :db_insert_placeholder_376, :db_insert_placeholder_377, :db_insert_placeholder_378, :db_insert_placeholder_379, :db_insert_placeholder_380, :db_insert_placeholder_381, :db_insert_placeholder_382, :db_insert_placeholder_383, :db_insert_placeholder_384, :db_insert_placeholder_385, :db_insert_placeholder_386, :db_insert_placeholder_387, :db_insert_placeholder_388, :db_insert_placeholder_389, :db_insert_placeholder_390), (:db_insert_placeholder_391, :db_insert_placeholder_392, :db_insert_placeholder_393, :db_insert_placeholder_394, :db_insert_placeholder_395, :db_insert_placeholder_396, :db_insert_placeholder_397, :db_insert_placeholder_398, :db_insert_placeholder_399, :db_insert_placeholder_400, :db_insert_placeholder_401, :db_insert_placeholder_402, :db_insert_placeholder_403, :db_insert_placeholder_404, :db_insert_placeholder_405, :db_insert_placeholder_406, :db_insert_placeholder_407, :db_insert_placeholder_408, :db_insert_placeholder_409, :db_insert_placeholder_410, :db_insert_placeholder_411, :db_insert_placeholder_412, :db_insert_placeholder_413), (:db_insert_placeholder_414, :db_insert_placeholder_415, :db_insert_placeholder_416, :db_insert_placeholder_417, :db_insert_placeholder_418, :db_insert_placeholder_419, :db_insert_placeholder_420, :db_insert_placeholder_421, :db_insert_placeholder_422, :db_insert_placeholder_423, :db_insert_placeholder_424, :db_insert_placeholder_425, :db_insert_placeholder_426, :db_insert_placeholder_427, :db_insert_placeholder_428, :db_insert_placeholder_429, :db_insert_placeholder_430, :db_insert_placeholder_431, :db_insert_placeholder_432, :db_insert_placeholder_433, :db_insert_placeholder_434, :db_insert_placeholder_435, :db_insert_placeholder_436), (:db_insert_placeholder_437, :db_insert_placeholder_438, :db_insert_placeholder_439, :db_insert_placeholder_440, :db_insert_placeholder_441, :db_insert_placeholder_442, :db_insert_placeholder_443, :db_insert_placeholder_444, :db_insert_placeholder_445, :db_insert_placeholder_446, :db_insert_placeholder_447, :db_insert_placeholder_448, :db_insert_placeholder_449, :db_insert_placeholder_450, :db_insert_placeholder_451, :db_insert_placeholder_452, :db_insert_placeholder_453, :db_insert_placeholder_454, :db_insert_placeholder_455, :db_insert_placeholder_456, :db_insert_placeholder_457, :db_insert_placeholder_458, :db_insert_placeholder_459); Array ( [:db_insert_placeholder_0] => taxonomy/term/%/feed [:db_insert_placeholder_1] => a:1:{i:2;s:18:"taxonomy_term_load";} [:db_insert_placeholder_2] => [:db_insert_placeholder_3] => user_access [:db_insert_placeholder_4] => a:1:{i:0;s:14:"access content";} [:db_insert_placeholder_5] => taxonomy_term_feed [:db_insert_placeholder_6] => a:1:{i:0;i:2;} [:db_insert_placeholder_7] => [:db_insert_placeholder_8] => 13 [:db_insert_placeholder_9] => 4 [:db_insert_placeholder_10] => 0 [:db_insert_placeholder_11] => [:db_insert_placeholder_12] => taxonomy/term/%/feed [:db_insert_placeholder_13] => Taxonomy term [:db_insert_placeholder_14] => taxonomy_term_title [:db_insert_placeholder_15] => a:1:{i:0;i:2;} [:db_insert_placeholder_16] => [:db_insert_placeholder_17] => a:0:{} [:db_insert_placeholder_18] => 0 [:db_insert_placeholder_19] => [:db_insert_placeholder_20] => [:db_insert_placeholder_21] => 0 [:db_insert_placeholder_22] => modules/taxonomy/taxonomy.pages.inc [:db_insert_placeholder_23] => admin/config/content/webform [:db_insert_placeholder_24] => [:db_insert_placeholder_25] => [:db_insert_placeholder_26] => user_access [:db_insert_placeholder_27] => a:1:{i:0;s:29:"administer site configuration";} [:db_insert_placeholder_28] => drupal_get_form [:db_insert_placeholder_29] => a:1:{i:0;s:22:"webform_admin_settings";} [:db_insert_placeholder_30] => [:db_insert_placeholder_31] => 15 [:db_insert_placeholder_32] => 4 [:db_insert_placeholder_33] => 0 [:db_insert_placeholder_34] => [:db_insert_placeholder_35] => admin/config/content/webform [:db_insert_placeholder_36] => Webform settings [:db_insert_placeholder_37] => t [:db_insert_placeholder_38] => [:db_insert_placeholder_39] => [:db_insert_placeholder_40] => a:0:{} [:db_insert_placeholder_41] => 6 [:db_insert_placeholder_42] => Global configuration of webform functionality. [:db_insert_placeholder_43] => [:db_insert_placeholder_44] => 0 [:db_insert_placeholder_45] => sites/all/modules/webform/includes/webform.admin.inc [:db_insert_placeholder_46] => admin/structure/taxonomy/% [:db_insert_placeholder_47] => a:1:{i:3;s:37:"taxonomy_vocabulary_machine_name_load";} [:db_insert_placeholder_48] => [:db_insert_placeholder_49] => user_access [:db_insert_placeholder_50] => a:1:{i:0;s:19:"administer taxonomy";} [:db_insert_placeholder_51] => drupal_get_form [:db_insert_placeholder_52] => a:2:{i:0;s:23:"taxonomy_overview_terms";i:1;i:3;} [:db_insert_placeholder_53] => [:db_insert_placeholder_54] => 14 [:db_insert_placeholder_55] => 4 [:db_insert_placeholder_56] => 0 [:db_insert_placeholder_57] => [:db_insert_placeholder_58] => admin/structure/taxonomy/% [:db_insert_placeholder_59] => [:db_insert_placeholder_60] => entity_label [:db_insert_placeholder_61] => a:2:{i:0;s:19:"taxonomy_vocabulary";i:1;i:3;} [:db_insert_placeholder_62] => [:db_insert_placeholder_63] => a:0:{} [:db_insert_placeholder_64] => 6 [:db_insert_placeholder_65] => [:db_insert_placeholder_66] => [:db_insert_placeholder_67] => 0 [:db_insert_placeholder_68] => modules/taxonomy/taxonomy.admin.inc [:db_insert_placeholder_69] => admin/structure/panels/layouts [:db_insert_placeholder_70] => [:db_insert_placeholder_71] => [:db_insert_placeholder_72] => ctools_export_ui_task_access [:db_insert_placeholder_73] => a:2:{i:0;s:14:"panels_layouts";i:1;s:4:"list";} [:db_insert_placeholder_74] => ctools_export_ui_switcher_page [:db_insert_placeholder_75] => a:2:{i:0;s:14:"panels_layouts";i:1;s:4:"list";} [:db_insert_placeholder_76] => [:db_insert_placeholder_77] => 15 [:db_insert_placeholder_78] => 4 [:db_insert_placeholder_79] => 1 [:db_insert_placeholder_80] => admin/structure/panels [:db_insert_placeholder_81] => admin/structure/panels [:db_insert_placeholder_82] => Layouts [:db_insert_placeholder_83] => t [:db_insert_placeholder_84] => [:db_insert_placeholder_85] => [:db_insert_placeholder_86] => a:0:{} [:db_insert_placeholder_87] => 132 [:db_insert_placeholder_88] => Add, edit or delete custom content layouts. [:db_insert_placeholder_89] => [:db_insert_placeholder_90] => 0 [:db_insert_placeholder_91] => sites/all/modules/ctools/includes/export-ui.inc [:db_insert_placeholder_92] => node/%/submission/% [:db_insert_placeholder_93] => a:2:{i:1;a:1:{s:17:"webform_menu_load";a:1:{i:0;i:1;}}i:3;a:1:{s:28:"webform_menu_submission_load";a:1:{i:0;i:1;}}} [:db_insert_placeholder_94] => [:db_insert_placeholder_95] => webform_submission_access [:db_insert_placeholder_96] => a:3:{i:0;i:1;i:1;i:3;i:2;s:4:"view";} [:db_insert_placeholder_97] => webform_submission_page [:db_insert_placeholder_98] => a:3:{i:0;i:1;i:1;i:3;i:2;s:4:"html";} [:db_insert_placeholder_99] => [:db_insert_placeholder_100] => 10 [:db_insert_placeholder_101] => 4 [:db_insert_placeholder_102] => 0 [:db_insert_placeholder_103] => [:db_insert_placeholder_104] => node/%/submission/% [:db_insert_placeholder_105] => Webform submission [:db_insert_placeholder_106] => webform_submission_title [:db_insert_placeholder_107] => a:2:{i:0;i:1;i:1;i:3;} [:db_insert_placeholder_108] => [:db_insert_placeholder_109] => a:0:{} [:db_insert_placeholder_110] => 0 [:db_insert_placeholder_111] => [:db_insert_placeholder_112] => [:db_insert_placeholder_113] => 0 [:db_insert_placeholder_114] => sites/all/modules/webform/includes/webform.submissions.inc [:db_insert_placeholder_115] => admin/structure/features/% [:db_insert_placeholder_116] => a:1:{i:3;a:1:{s:12:"feature_load";a:2:{i:0;i:3;i:1;b:1;}}} [:db_insert_placeholder_117] => [:db_insert_placeholder_118] => user_access [:db_insert_placeholder_119] => a:1:{i:0;s:19:"administer features";} [:db_insert_placeholder_120] => drupal_get_form [:db_insert_placeholder_121] => a:2:{i:0;s:25:"features_admin_components";i:1;i:3;} [:db_insert_placeholder_122] => [:db_insert_placeholder_123] => 14 [:db_insert_placeholder_124] => 4 [:db_insert_placeholder_125] => 0 [:db_insert_placeholder_126] => [:db_insert_placeholder_127] => admin/structure/features/% [:db_insert_placeholder_128] => [:db_insert_placeholder_129] => features_get_feature_title [:db_insert_placeholder_130] => a:1:{i:0;i:3;} [:db_insert_placeholder_131] => [:db_insert_placeholder_132] => a:0:{} [:db_insert_placeholder_133] => 0 [:db_insert_placeholder_134] => Display components of a feature. [:db_insert_placeholder_135] => [:db_insert_placeholder_136] => 0 [:db_insert_placeholder_137] => sites/all/modules/features/features.admin.inc [:db_insert_placeholder_138] => admin/config/search/redirect/list [:db_insert_placeholder_139] => [:db_insert_placeholder_140] => [:db_insert_placeholder_141] => user_access [:db_insert_placeholder_142] => a:1:{i:0;s:20:"administer redirects";} [:db_insert_placeholder_143] => drupal_get_form [:db_insert_placeholder_144] => a:1:{i:0;s:18:"redirect_list_form";} [:db_insert_placeholder_145] => [:db_insert_placeholder_146] => 31 [:db_insert_placeholder_147] => 5 [:db_insert_placeholder_148] => 1 [:db_insert_placeholder_149] => admin/config/search/redirect [:db_insert_placeholder_150] => admin/config/search/redirect [:db_insert_placeholder_151] => List [:db_insert_placeholder_152] => t [:db_insert_placeholder_153] => [:db_insert_placeholder_154] => [:db_insert_placeholder_155] => a:0:{} [:db_insert_placeholder_156] => 140 [:db_insert_placeholder_157] => [:db_insert_placeholder_158] => [:db_insert_placeholder_159] => -10 [:db_insert_placeholder_160] => sites/all/modules/redirect/redirect.admin.inc [:db_insert_placeholder_161] => admin/config/search/xmlsitemap/list [:db_insert_placeholder_162] => [:db_insert_placeholder_163] => [:db_insert_placeholder_164] => user_access [:db_insert_placeholder_165] => a:1:{i:0;s:21:"administer xmlsitemap";} [:db_insert_placeholder_166] => drupal_get_form [:db_insert_placeholder_167] => a:1:{i:0;s:28:"xmlsitemap_sitemap_list_form";} [:db_insert_placeholder_168] => [:db_insert_placeholder_169] => 31 [:db_insert_placeholder_170] => 5 [:db_insert_placeholder_171] => 1 [:db_insert_placeholder_172] => admin/config/search/xmlsitemap [:db_insert_placeholder_173] => admin/config/search/xmlsitemap [:db_insert_placeholder_174] => List [:db_insert_placeholder_175] => t [:db_insert_placeholder_176] => [:db_insert_placeholder_177] => [:db_insert_placeholder_178] => a:0:{} [:db_insert_placeholder_179] => 140 [:db_insert_placeholder_180] => [:db_insert_placeholder_181] => [:db_insert_placeholder_182] => -10 [:db_insert_placeholder_183] => sites/all/modules/xmlsitemap/xmlsitemap.admin.inc [:db_insert_placeholder_184] => admin/config/content/formats/list [:db_insert_placeholder_185] => [:db_insert_placeholder_186] => [:db_insert_placeholder_187] => user_access [:db_insert_placeholder_188] => a:1:{i:0;s:18:"administer filters";} [:db_insert_placeholder_189] => drupal_get_form [:db_insert_placeholder_190] => a:1:{i:0;s:21:"filter_admin_overview";} [:db_insert_placeholder_191] => [:db_insert_placeholder_192] => 31 [:db_insert_placeholder_193] => 5 [:db_insert_placeholder_194] => 1 [:db_insert_placeholder_195] => admin/config/content/formats [:db_insert_placeholder_196] => admin/config/content/formats [:db_insert_placeholder_197] => List [:db_insert_placeholder_198] => t [:db_insert_placeholder_199] => [:db_insert_placeholder_200] => [:db_insert_placeholder_201] => a:0:{} [:db_insert_placeholder_202] => 140 [:db_insert_placeholder_203] => [:db_insert_placeholder_204] => [:db_insert_placeholder_205] => 0 [:db_insert_placeholder_206] => modules/filter/filter.admin.inc [:db_insert_placeholder_207] => admin/structure/taxonomy/%/list [:db_insert_placeholder_208] => a:1:{i:3;s:37:"taxonomy_vocabulary_machine_name_load";} [:db_insert_placeholder_209] => [:db_insert_placeholder_210] => user_access [:db_insert_placeholder_211] => a:1:{i:0;s:19:"administer taxonomy";} [:db_insert_placeholder_212] => drupal_get_form [:db_insert_placeholder_213] => a:2:{i:0;s:23:"taxonomy_overview_terms";i:1;i:3;} [:db_insert_placeholder_214] => [:db_insert_placeholder_215] => 29 [:db_insert_placeholder_216] => 5 [:db_insert_placeholder_217] => 1 [:db_insert_placeholder_218] => admin/structure/taxonomy/% [:db_insert_placeholder_219] => admin/structure/taxonomy/% [:db_insert_placeholder_220] => List [:db_insert_placeholder_221] => t [:db_insert_placeholder_222] => [:db_insert_placeholder_223] => [:db_insert_placeholder_224] => a:0:{} [:db_insert_placeholder_225] => 140 [:db_insert_placeholder_226] => [:db_insert_placeholder_227] => [:db_insert_placeholder_228] => -20 [:db_insert_placeholder_229] => modules/taxonomy/taxonomy.admin.inc [:db_insert_placeholder_230] => admin/config/search/path/list [:db_insert_placeholder_231] => [:db_insert_placeholder_232] => [:db_insert_placeholder_233] => user_access [:db_insert_placeholder_234] => a:1:{i:0;s:22:"administer url aliases";} [:db_insert_placeholder_235] => path_admin_overview [:db_insert_placeholder_236] => a:0:{} [:db_insert_placeholder_237] => [:db_insert_placeholder_238] => 31 [:db_insert_placeholder_239] => 5 [:db_insert_placeholder_240] => 1 [:db_insert_placeholder_241] => admin/config/search/path [:db_insert_placeholder_242] => admin/config/search/path [:db_insert_placeholder_243] => List [:db_insert_placeholder_244] => t [:db_insert_placeholder_245] => [:db_insert_placeholder_246] => [:db_insert_placeholder_247] => a:0:{} [:db_insert_placeholder_248] => 140 [:db_insert_placeholder_249] => [:db_insert_placeholder_250] => [:db_insert_placeholder_251] => -10 [:db_insert_placeholder_252] => modules/path/path.admin.inc [:db_insert_placeholder_253] => taxonomy/term/%/devel/load [:db_insert_placeholder_254] => a:1:{i:2;s:18:"taxonomy_term_load";} [:db_insert_placeholder_255] => [:db_insert_placeholder_256] => user_access [:db_insert_placeholder_257] => a:1:{i:0;s:24:"access devel information";} [:db_insert_placeholder_258] => devel_load_object [:db_insert_placeholder_259] => a:3:{i:0;s:13:"taxonomy_term";i:1;i:2;i:2;s:4:"term";} [:db_insert_placeholder_260] => [:db_insert_placeholder_261] => 27 [:db_insert_placeholder_262] => 5 [:db_insert_placeholder_263] => 1 [:db_insert_placeholder_264] => taxonomy/term/%/devel [:db_insert_placeholder_265] => taxonomy/term/% [:db_insert_placeholder_266] => Load [:db_insert_placeholder_267] => t [:db_insert_placeholder_268] => [:db_insert_placeholder_269] => [:db_insert_placeholder_270] => a:0:{} [:db_insert_placeholder_271] => 140 [:db_insert_placeholder_272] => [:db_insert_placeholder_273] => [:db_insert_placeholder_274] => 0 [:db_insert_placeholder_275] => sites/all/modules/devel/devel.pages.inc [:db_insert_placeholder_276] => admin/config/workflow/rules/reaction [:db_insert_placeholder_277] => [:db_insert_placeholder_278] => [:db_insert_placeholder_279] => user_access [:db_insert_placeholder_280] => a:1:{i:0;s:16:"administer rules";} [:db_insert_placeholder_281] => drupal_get_form [:db_insert_placeholder_282] => a:2:{i:0;s:29:"rules_admin_reaction_overview";i:1;s:36:"admin/config/workflow/rules/reaction";} [:db_insert_placeholder_283] => [:db_insert_placeholder_284] => 31 [:db_insert_placeholder_285] => 5 [:db_insert_placeholder_286] => 1 [:db_insert_placeholder_287] => admin/config/workflow/rules [:db_insert_placeholder_288] => admin/config/workflow/rules [:db_insert_placeholder_289] => Rules [:db_insert_placeholder_290] => t [:db_insert_placeholder_291] => [:db_insert_placeholder_292] => [:db_insert_placeholder_293] => a:0:{} [:db_insert_placeholder_294] => 140 [:db_insert_placeholder_295] => [:db_insert_placeholder_296] => [:db_insert_placeholder_297] => -1 [:db_insert_placeholder_298] => sites/all/modules/rules/rules_admin/rules_admin.inc [:db_insert_placeholder_299] => admin/config/people/accounts/settings [:db_insert_placeholder_300] => [:db_insert_placeholder_301] => [:db_insert_placeholder_302] => user_access [:db_insert_placeholder_303] => a:1:{i:0;s:16:"administer users";} [:db_insert_placeholder_304] => drupal_get_form [:db_insert_placeholder_305] => a:1:{i:0;s:19:"user_admin_settings";} [:db_insert_placeholder_306] => [:db_insert_placeholder_307] => 31 [:db_insert_placeholder_308] => 5 [:db_insert_placeholder_309] => 1 [:db_insert_placeholder_310] => admin/config/people/accounts [:db_insert_placeholder_311] => admin/config/people/accounts [:db_insert_placeholder_312] => Settings [:db_insert_placeholder_313] => t [:db_insert_placeholder_314] => [:db_insert_placeholder_315] => [:db_insert_placeholder_316] => a:0:{} [:db_insert_placeholder_317] => 140 [:db_insert_placeholder_318] => [:db_insert_placeholder_319] => [:db_insert_placeholder_320] => -10 [:db_insert_placeholder_321] => modules/user/user.admin.inc [:db_insert_placeholder_322] => admin/config/system/variable/group [:db_insert_placeholder_323] => [:db_insert_placeholder_324] => [:db_insert_placeholder_325] => user_access [:db_insert_placeholder_326] => a:1:{i:0;s:29:"administer site configuration";} [:db_insert_placeholder_327] => variable_admin_page_group [:db_insert_placeholder_328] => a:0:{} [:db_insert_placeholder_329] => [:db_insert_placeholder_330] => 31 [:db_insert_placeholder_331] => 5 [:db_insert_placeholder_332] => 1 [:db_insert_placeholder_333] => admin/config/system/variable [:db_insert_placeholder_334] => admin/config/system/variable [:db_insert_placeholder_335] => Groups [:db_insert_placeholder_336] => t [:db_insert_placeholder_337] => [:db_insert_placeholder_338] => [:db_insert_placeholder_339] => a:0:{} [:db_insert_placeholder_340] => 140 [:db_insert_placeholder_341] => Variables per group. [:db_insert_placeholder_342] => [:db_insert_placeholder_343] => 0 [:db_insert_placeholder_344] => sites/all/modules/variable/variable_admin/variable_admin.inc [:db_insert_placeholder_345] => admin/structure/panels/settings/panels-mini [:db_insert_placeholder_346] => [:db_insert_placeholder_347] => [:db_insert_placeholder_348] => user_access [:db_insert_placeholder_349] => a:1:{i:0;s:18:"create mini panels";} [:db_insert_placeholder_350] => panels_mini_settings [:db_insert_placeholder_351] => a:0:{} [:db_insert_placeholder_352] => [:db_insert_placeholder_353] => 31 [:db_insert_placeholder_354] => 5 [:db_insert_placeholder_355] => 1 [:db_insert_placeholder_356] => admin/structure/panels/settings [:db_insert_placeholder_357] => admin/structure/panels [:db_insert_placeholder_358] => Mini panels [:db_insert_placeholder_359] => t [:db_insert_placeholder_360] => [:db_insert_placeholder_361] => [:db_insert_placeholder_362] => a:0:{} [:db_insert_placeholder_363] => 132 [:db_insert_placeholder_364] => [:db_insert_placeholder_365] => [:db_insert_placeholder_366] => 0 [:db_insert_placeholder_367] => [:db_insert_placeholder_368] => admin/dashboard/block-content/%/% [:db_insert_placeholder_369] => a:2:{i:3;N;i:4;N;} [:db_insert_placeholder_370] => [:db_insert_placeholder_371] => user_access [:db_insert_placeholder_372] => a:1:{i:0;s:17:"administer blocks";} [:db_insert_placeholder_373] => dashboard_show_block_content [:db_insert_placeholder_374] => a:2:{i:0;i:3;i:1;i:4;} [:db_insert_placeholder_375] => [:db_insert_placeholder_376] => 28 [:db_insert_placeholder_377] => 5 [:db_insert_placeholder_378] => 0 [:db_insert_placeholder_379] => [:db_insert_placeholder_380] => admin/dashboard/block-content/%/% [:db_insert_placeholder_381] => [:db_insert_placeholder_382] => t [:db_insert_placeholder_383] => [:db_insert_placeholder_384] => [:db_insert_placeholder_385] => a:0:{} [:db_insert_placeholder_386] => 0 [:db_insert_placeholder_387] => [:db_insert_placeholder_388] => [:db_insert_placeholder_389] => 0 [:db_insert_placeholder_390] => [:db_insert_placeholder_391] => flipcard/quiz/%/progress/level-1 [:db_insert_placeholder_392] => a:1:{i:2;N;} [:db_insert_placeholder_393] => [:db_insert_placeholder_394] => user_access [:db_insert_placeholder_395] => a:1:{i:0;s:27:"flipcard authenticated user";} [:db_insert_placeholder_396] => flipcard_levels [:db_insert_placeholder_397] => a:2:{i:0;i:2;i:1;i:4;} [:db_insert_placeholder_398] => [:db_insert_placeholder_399] => 27 [:db_insert_placeholder_400] => 5 [:db_insert_placeholder_401] => 1 [:db_insert_placeholder_402] => flipcard/quiz/%/progress [:db_insert_placeholder_403] => flipcard/quiz/% [:db_insert_placeholder_404] => [:db_insert_placeholder_405] => t [:db_insert_placeholder_406] => [:db_insert_placeholder_407] => [:db_insert_placeholder_408] => a:0:{} [:db_insert_placeholder_409] => 132 [:db_insert_placeholder_410] => [:db_insert_placeholder_411] => [:db_insert_placeholder_412] => 1 [:db_insert_placeholder_413] => [:db_insert_placeholder_414] => admin/config/search/path/add [:db_insert_placeholder_415] => [:db_insert_placeholder_416] => [:db_insert_placeholder_417] => user_access [:db_insert_placeholder_418] => a:1:{i:0;s:22:"administer url aliases";} [:db_insert_placeholder_419] => path_admin_edit [:db_insert_placeholder_420] => a:0:{} [:db_insert_placeholder_421] => [:db_insert_placeholder_422] => 31 [:db_insert_placeholder_423] => 5 [:db_insert_placeholder_424] => 1 [:db_insert_placeholder_425] => admin/config/search/path [:db_insert_placeholder_426] => admin/config/search/path [:db_insert_placeholder_427] => Add alias [:db_insert_placeholder_428] => t [:db_insert_placeholder_429] => [:db_insert_placeholder_430] => [:db_insert_placeholder_431] => a:0:{} [:db_insert_placeholder_432] => 388 [:db_insert_placeholder_433] => [:db_insert_placeholder_434] => [:db_insert_placeholder_435] => 0 [:db_insert_placeholder_436] => modules/path/path.admin.inc [:db_insert_placeholder_437] => admin/config/media/imce/profile [:db_insert_placeholder_438] => [:db_insert_placeholder_439] => [:db_insert_placeholder_440] => user_access [:db_insert_placeholder_441] => a:1:{i:0;s:15:"administer imce";} [:db_insert_placeholder_442] => imce_profile_operations [:db_insert_placeholder_443] => a:0:{} [:db_insert_placeholder_444] => [:db_insert_placeholder_445] => 31 [:db_insert_placeholder_446] => 5 [:db_insert_placeholder_447] => 0 [:db_insert_placeholder_448] => [:db_insert_placeholder_449] => admin/config/media/imce/profile [:db_insert_placeholder_450] => Add new profile [:db_insert_placeholder_451] => t [:db_insert_placeholder_452] => [:db_insert_placeholder_453] => [:db_insert_placeholder_454] => a:0:{} [:db_insert_placeholder_455] => 4 [:db_insert_placeholder_456] => [:db_insert_placeholder_457] => [:db_insert_placeholder_458] => 0 [:db_insert_placeholder_459] => sites/all/modules/imce/inc/imce.admin.inc ) in _menu_router_save() (line 3837 of /var/www/includes/menu.inc).
drupalshrek’s picture

You can ignore my last post: in my case, it was my own code that I had changed and broken.

You might though be interested in my post explaining How I solved my "PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'title' cannot be null" error.

amontero’s picture

Issue tags: +Needs reroll
jayeshanandani’s picture

Status: Needs work » Needs review
Issue tags: -Needs reroll
FileSize
4.37 KB

Rerolle the patch.

Status: Needs review » Needs work

The last submitted patch, 138: 619542.138.patch, failed testing.

jayeshanandani’s picture

Status: Needs work » Needs review
FileSize
271.33 KB

The previous patch had some syntax error. Corrected that syntax error and uploaded the patch again.

sun’s picture

Version: 8.x-dev » 7.x-dev
Status: Needs review » Needs work

This is no longer an issue in D8, for two reasons:

  1. Drupal\Core\Extension\InfoParser already throws an exception if an extension .info.yml file does not declare the required keys 'type', 'core', and 'name', so a malformed theme is not able to enter the system in the first place.
  2. The old menu router no longer exists.

Moving back to D7.

jgrubb’s picture

If you are creating a theme using AngularJs and the Yeoman Angular generator --

The generator installs a package called grunt-svgmin, which has a dependency of a dependency of a dependency that has a file inside it called lcov.info. This is your problem.

rm -rf node_modules and drush cc all, then remove grunt-svgmin from your package.json and npm install again.

Big thanks to Drupalshrek for the debugging tip.

mikl’s picture

I've been struggling with this as well. As it turns out, my Sass setup generates the file themes/whatever/.vendor/bundle/ruby/2.0.0/gems/ffi-1.9.3/ext/ffi_c/libffi/doc/libffi.info

This file is obviously not a Drupal module info file, but Drupal will still to install it as such, and thus break the site :(

A quick shell command to get around this:

find . -type f -name "libffi.info" | xargs rm

lotyrin’s picture

Anyone getting this from including node modules from NPM including "lcov.info", please send pull requests to the projects in question to add their coverage folder to NPM's ignore file.

There's no point in having the coverage data shipped with the modules, it just bloats their package download size, so fixing this helps them out too.

Anonymous’s picture

I have just encountered this issue. The solution was to trim any values to max 251 characters. Drupal 7.31.

malcomio’s picture

Status: Needs work » Needs review
FileSize
480 bytes

The patch at #2329453-8: Ignore front end vendor folders to improve directory search performance by SebCorbin fixed the issue for me.

As suggested by JohnAlbin in another comment on that issue it would be worth excluding bower_components as well.

So here's a re-roll of that patch that excludes node_modules and bower_components directories from file_scan_directory

With regard to getting individual NPM repos fixed, yes that's a good idea, but Drupal should adopt the robustness principle. Some code left in another repository that doesn't even run PHP shouldn't break a Drupal site.

malcomio’s picture

kevinquillen’s picture

This just got me as well, and as mentioned, I am using Gulp with BrowserSync. It has a .info file that is the culprit. The patch in #146 fixed it for me.

I would prefer Drupal to ignore these directories than to scan and delete .info files from node_modules, because who knows what they would be used for.

It would be great if this made it in sooner than later, with Grunt/Gulp/Bower becoming more commonplace. It sucks to have half a day or more eaten away with a segfault error.

JohnAlbin’s picture

Priority: Normal » Major
Status: Needs review » Reviewed & tested by the community

In https://www.drupal.org/node/2329453#comment-9702873, I said:

So _this_ explains why my Drupal 7 dev site was seg faulting for the last week. *sigh*

The patch in #147 fixes it.

The D8 equivalent of this patch (skipping node_modules and bower_components) is not a bug, but a feature request since D8 does not WSOD on broken .info files. We can handle that in #2329453: Ignore front end vendor folders to improve directory search performance.

Status: Reviewed & tested by the community » Needs work

The last submitted patch, 146: malformed_theme_info-619542-146.patch, failed testing.

Status: Needs work » Needs review
kevinquillen’s picture

D8 does not WSOD on broken .info files

Actually, until I applied the patch, my D8 was not WSOD but was causing things like Views to not work correctly. My previews would not return query results and would take a really long time to respond. As soon as I applied the patch, the problem vanished.

joelstein’s picture

Status: Needs review » Reviewed & tested by the community

The patch in #146 works for me, and it is a sensible solution considering the popularity of npm and bower.

RobLoach’s picture

In #2329453-19, I demonstrated how a malformed .info file can break Drupal 7. This is a major issue, if not critical. The patch at #146 is still RTBC.

David_Rothstein’s picture

Status: Reviewed & tested by the community » Needs work

The latest patch does not fix the bug people are experiencing here (drush dl sky-7.x-1.0 && drush cc all => PDOException and similar issues).

I'd commit it anyway (and just leave this issue open afterwards) but there are some concerns with the approach being discussed at #2329453: Ignore front end vendor folders to improve directory search performance so I think we should keep the discussion in that issue.

For this issue, #68 really looks like a fine fix to me. That is sensible fallback behavior, and I don't think it needs to be more complicated than that. Two comments:

  1. If we're going to do that for theme .info files we should probably do it for .module info files too, to keep things consistent.
  2. Something looks wrong with the code comment; did it mean to say "name key" rather than "info key"?

I could imagine some additional behavior to make this a little smarter about totally ignoring obviously bogus .info files (e.g. if both "name" and "core" are missing from the .info file, then it's probably not even a Drupal file so it's worth throwing the .info file out entirely rather than displaying it on the module or themes admin page). But that could be a followup issue...

dddbbb’s picture

Agreed that this is a serious & frustrating issue - especially for themers like myself getting increasingly into node & bower. It took me a while to realise that the perf issues I was experiencing locally were a result of this - that cost me a fair amount of time troubleshooting and I doubt I'm alone there. It wasn't until I started seeing seg faults that I discovered this issue & https://www.drupal.org/node/2329453. The patch in #146 of this issue works for me.

I am a little confused as to which issue this conversation should be continued in as they both kinda point to each other ATM.

Status: Needs work » Needs review

The last submitted patch, 68: theme-info-name-619542-68.patch, failed testing.

othermachines’s picture

I just got bit while using npm and bower to do theme development. Patch in #146 solved it. Thanks!

kevinquillen’s picture

Until core is patched, here is how I did a workaround in my theme's Gulp package.json file:

http://cgit.drupalcode.org/neato/tree/STARTER/package.json

{
  "name": "STARTER",
  "version": "0.0.1",
  "devDependencies": {
    "browser-sync": "^2.4.0",
    "embittered": "0.0.9",
    "gulp": "^3.8.11",
    "gulp-notify": "^2.2.0",
    "gulp-sass": "*",
    "gulp-shell": "^0.4.0",
    "gulp-sourcemaps": "^1.5.1",
    "gulp-uglify": "^1.1.0",
    "gulp-util": "*",
    "gulp-watch": "*",
    "node-bourbon": "^4.2.1-beta1",
    "node-neat": "^1.7.1-beta1",
    "node-refills": "^1.0.1",
    "rimraf": "*"
  },
  "scripts": {
    "postinstall": "node_modules/.bin/rimraf node_modules/**/*.info"
  }
}

rimraf is a library that emulates Unix's 'rm -rf' command (remove all, recursively, forced) and I am executing that against any file that matches .info in the node_modules folder. This command works on Windows, Unix, and OSX, which is why I included this library.

JohnAlbin’s picture

I think I accidentally derailed this issue in my comment #149 above. The patch in #146 fixes my problem, but that's not _this_ problem.

Here's a patch to make up for it.

If we're going to do that for theme .info files we should probably do it for .module info files too, to keep things consistent.

Agreed. Done!

Something looks wrong with the code comment; did it mean to say "name key" rather than "info key"?

Fixed.

Also, I'll move the patch in #146 over to #2329453: Ignore front end vendor folders to improve directory search performance for the D7 backport of that issue.

KrisBulman’s picture

Status: Needs review » Reviewed & tested by the community

Confirming patch #163 rerolled by John works

cilefen’s picture

David_Rothstein’s picture

Status: Reviewed & tested by the community » Fixed
Issue tags: +7.40 release notes

Committed to 7.x - thanks!

I guess an automated test would have been nice here, but the code is very straightforward and well-commented so it should be fine without one.

With this fixed and #2329453: Ignore front end vendor folders to improve directory search performance not yet fixed, I guess we'll see if anything unusual starts showing up on people's Appearance pages in the meantime :) I'm adding this to CHANGELOG.txt and the release notes for that reason.

  • David_Rothstein committed e88bbea on
    Issue #619542 by dcrocks, bfroehle, catch, amontero, jayeshanandani,...

Status: Fixed » Closed (fixed)

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