r98339 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r98338‎ | r98339 | r98340 >
Date:18:08, 28 September 2011
Author:reedy
Status:resolved (Comments)
Tags:scaptrap, schema 
Comment:
* (bug 31204) Remove old user.user_options

Added run of ConvertUserOptions maintenance script into update.php before dropping the column

Removed usages of user_options in code

Marked User::decodeOptions() deprecated as of 1.19.

Made ConvertUserOptions drop out early if the user_options field doesn't exist

Made ConvertUserOptions update user_options to '' after migration of user options to mOptions
Modified paths:
  • /trunk/phase3/includes/User.php (modified) (history)
  • /trunk/phase3/includes/installer/DatabaseUpdater.php (modified) (history)
  • /trunk/phase3/includes/installer/MysqlUpdater.php (modified) (history)
  • /trunk/phase3/includes/installer/SqliteUpdater.php (modified) (history)
  • /trunk/phase3/maintenance/archives/patch-drop-user_options.sql (added) (history)
  • /trunk/phase3/maintenance/convertUserOptions.php (modified) (history)
  • /trunk/phase3/maintenance/tables.sql (modified) (history)
  • /trunk/phase3/tests/selenium/data/SimpleSeleniumTestDB.sql (modified) (history)
  • /trunk/phase3/tests/selenium/data/mediawiki118_fresh_installation.sql (modified) (history)

Diff [purge]

Index: trunk/phase3/maintenance/tables.sql
@@ -86,12 +86,6 @@
8787 -- Same with passwords.
8888 user_email tinytext NOT NULL,
8989
90 - -- Newline-separated list of name=value defining the user
91 - -- preferences
92 - -- Now obsolete in favour of user_properties table;
93 - -- old values will be migrated from here transparently.
94 - user_options blob NOT NULL,
95 -
9690 -- This is a timestamp which is updated when a user
9791 -- logs in, logs out, changes preferences, or performs
9892 -- some other action requiring HTML cache invalidation
@@ -1493,7 +1487,7 @@
14941488
14951489 -- The namespace of the calling page on the remote wiki
14961490 -- Needed for display purposes, since the foreign namespace ID doesn't necessarily match a local one
1497 - -- The link between the namespace and the namespace name is made by the globalnamespaces table
 1491+ -- The link between the namespace and the namespace name is made by the globalnamespaces table
14981492 gtl_from_namespace int NOT NULL,
14991493
15001494 -- The title of the calling page on the remote wiki
Index: trunk/phase3/maintenance/archives/patch-drop-user_options.sql
@@ -0,0 +1 @@
 2+ALTER TABLE /*_*/user DROP COLUMN user_options;
\ No newline at end of file
Property changes on: trunk/phase3/maintenance/archives/patch-drop-user_options.sql
___________________________________________________________________
Added: svn:eol-style
13 + native
Index: trunk/phase3/maintenance/convertUserOptions.php
@@ -37,23 +37,34 @@
3838 $id = 0;
3939 $dbw = wfGetDB( DB_MASTER );
4040
 41+ if ( !$dbw->fieldExists( 'user', 'user_options ' ) ) {
 42+ $this->output( "No user_options field in the user table. Nothing to migrate" );
 43+ return;
 44+ }
4145 while ( $id !== null ) {
42 - $idCond = 'user_id>' . $dbw->addQuotes( $id );
43 - $optCond = "user_options!=" . $dbw->addQuotes( '' ); // For compatibility
 46+ $idCond = 'user_id > ' . $dbw->addQuotes( $id );
 47+ $optCond = "user_options != " . $dbw->addQuotes( '' ); // For compatibility
4448 $res = $dbw->select( 'user', '*',
45 - array( $optCond, $idCond ), __METHOD__,
46 - array( 'LIMIT' => 50, 'FOR UPDATE' ) );
 49+ array( $optCond, $idCond ), __METHOD__,
 50+ array( 'LIMIT' => 50, 'FOR UPDATE' )
 51+ );
4752 $id = $this->convertOptionBatch( $res, $dbw );
4853 $dbw->commit();
4954
5055 wfWaitForSlaves();
5156
52 - if ( $id )
 57+ if ( $id ) {
5358 $this->output( "--Converted to ID $id\n" );
 59+ }
5460 }
5561 $this->output( "Conversion done. Converted " . $this->mConversionCount . " user records.\n" );
5662 }
5763
 64+ /**
 65+ * @param $res
 66+ * @param $dbw DatabaseBase
 67+ * @return null|int
 68+ */
5869 function convertOptionBatch( $res, $dbw ) {
5970 $id = null;
6071 foreach ( $res as $row ) {
@@ -62,6 +73,14 @@
6374 $u = User::newFromRow( $row );
6475
6576 $u->saveSettings();
 77+
 78+ // Do this here as saveSettings() doesn't set user_options to '' anymore!
 79+ $dbw->update(
 80+ 'user',
 81+ array( 'user_options' => '' ),
 82+ array( 'user_id' => $row->user_id ),
 83+ __METHOD__
 84+ );
6685 $id = $row->user_id;
6786 }
6887
Index: trunk/phase3/tests/selenium/data/SimpleSeleniumTestDB.sql
@@ -1295,7 +1295,6 @@
12961296 `user_newpassword` tinyblob NOT NULL,
12971297 `user_newpass_time` binary(14) DEFAULT NULL,
12981298 `user_email` tinytext NOT NULL,
1299 - `user_options` blob NOT NULL,
13001299 `user_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
13011300 `user_token` binary(32) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
13021301 `user_email_authenticated` binary(14) DEFAULT NULL,
Index: trunk/phase3/tests/selenium/data/mediawiki118_fresh_installation.sql
@@ -767,13 +767,13 @@
768768
769769 LOCK TABLES `mw_objectcache` WRITE;
770770 /*!40000 ALTER TABLE `mw_objectcache` DISABLE KEYS */;
771 -INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:messages:en','K�2��.�2�R\ns\r\n���S�δ2��\0','2010-12-31 13:16:31');
772 -INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:pcache:idhash:1-0!*!*!!en!*','�V[o�F�g~�����B��P��m)$TK�U��\0�����8$��9�a\rI�l��X>��ܹ�q�Sa,��ʕ� x��?[~ʃ|�.Z��$�8Y�\'�I�Y�K��-\04�U����J�\'&�uB)�:I������E�m�sk`�`k�Q�v��a���\rZ��t�0����+P%GE�ـ�JX;\n-s�P�@�B�b���8~�첒$��ea�υ��f����+���0[,�F�x��d�\'�z�0��BJ����=�����J��c�\\��:��&B��T��\'��C��Fdÿ׆Fq����Gd����%8G�0��A�I��; Ԙ`�7�5�LI\r��(���{�c�����g+��8Qr��&�ͦ��A)�V��ЕPT��\\UƧtn��Z�e�SfJZ(V�P�}�����0���O�N �=j�\\H� �y�\\�U[h]T:� ��bd��u��+�j%\'�6k��f:E�;�@Yך��4���Ȁ��q� ��Z�º6<b�3��TU(d��,\n���Y|�e�\'�5��T�fU�8}�\"��m���/���}Uk�9o��;����|*R?�n��� 3d��g1��y�\\f8gk�����w��=��:/Y7���ۋ�^<�Ō�����v#���i����C�#���6\Z�.0�Ua$4�=\Z���;��4����Y=���5���:kpΐq��Ŧ4��X���C��qYߵ-��Lj�����D�f���� �:����(3t��14C��J�#����������WXT���Δy:�^�6�v�7����I�U�Ee��(�p0��ga�6Mj��Sc�,ѫ@��ޅ+R����A���xХ\'6���utǷbۛ��`j�8ؚ�G�IC<KS��5�|�krJ\ry�\\b3xP�����ua�@����$SS�`��tQ.gwW��\r@\'���w�� ��xZ(�>5{� ���dw�>�=J)\r�6t ��X����M���B�\n�ŖT����b>�qg���� 7� �z�n7��vwr�-%u�-Qi�iX1��Ne���A#�v��ӧ�3��?','2010-12-31 13:16:31');
773 -INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:pcache:idoptions:1','E���@ D��`� \"v�ƣ��Wh��,�b�!���⭙7�L+�|}�t ��I�$�<���F\rpSl�4����OJN`\r\Z��� � ծ���)��PY��$�K����գ9�Vjp72��E���c�Wp�2��cVxu7�� ����p#�r=.���[>y)Zp��','2010-12-31 13:16:31');
774 -INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-css:3832ee25d9c44988461f5f339b9b6a48','+�26�Rr�MM�LTH�ɩV\0�Z(��(3�(R�d\r\0','2038-01-19 03:14:07');
775 -INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-css:aa0df16258ad99a1d249e796b5067ed9','+�2��Rr�MM�LTH�ɩN��K-�Q.,�L�NJ,R\0��s򋬔�\r���V�\Z\0','2038-01-19 03:14:07');
776 -INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-js:22814eeadc9cf0a9ebcd844e14198e66','m��r�0 ��y ����r�&Qޡמ!\n�qQ�Xq;}���$��ވ� �c!]]].o5S�\n�)Fq ��L^���?�s�F�!�O�M\\�������\0���N��Ɂ���լ����:��-�j��F��{ۅ�G�\"i��� \Z�6�K����!��Y]=�F[�~竍���䶃����`��9N�Ǵ���@�K���|z����1�A��@J#_ԁ�7\'�l�1) J�͵�).�3 z�f�T�A���Hњ�[#)�BzRA�7֌��\"T�*~SW���/P���B�Ŏ;\Z�ay�6�����+U��?.$�6��-uT�v@h��s�&�����Nإb�fJ�~�]6��p��/q)�>�E�1��͔A\ne�L�g\ZE�`cW�����`fJ�E�a��>��b\n�ӑd�.u�do��[�\nt��b�+���l\Z?X*��Y�(�օ;�L�Jqťɝ���d$�\"�WzG��-@b~+�#�kǞَ�Ƃ~������P)B �����q�Җ2���r�Rl����`z �4�����ÝX�m�;�X݁t;r.�sA��R��y)�kA�\nR�JT��J�U��*�W��_ߟ�4@�vt��f���>����x���','2038-01-19 03:14:07');
777 -INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-js:dd9440c19c575629ac5ec90e489cf62e','+�21�R���Ԕ�����L���Ĕ�\"��ĒT�j��̒T%+���ĔJ�ZMk.%k\0','2038-01-19 03:14:07');
 771+INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:messages:en','K�2��.�2�R\ns\r\n���S�δ2��\0','2010-12-31 13:16:31');
 772+INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:pcache:idhash:1-0!*!*!!en!*','�V[o�F�g~�����B��P��m)$TK�U��\0�����8$��9�a\rI�l��X>��ܹ�q�Sa,��ʕ� x��?[~ʃ|�.Z��$�8Y�\'�I�Y�K��-\04�U����J�\'&�uB)�:I������E�m�sk`�`k�Q�v��a���\rZ��t�0����+P%GE�ـ�JX;\n-s�P�@�B�b���8~�첒$��ea�υ��f��+���0[,�F�x��d�\'�z�0��BJ���=���J��c�\\��:��&B��T��\'��C��Fdÿ׆Fq����Gd����%8G�0��A�I��; Ԙ`�7�5�LI\r��(���{�c�����g+��8Qr�&�ͦ��A)�V��ЕPT��\\UƧtn��Z�e�SfJZ(V�P�}����0��O�N �=j�\\H� �y�\\�U[h]T:� ��bd��u��+�j%\'�6k��f:E�;�@Yך��4���Ȁ��q� ��Z�º6<b�3��TU(d��,\n���Y|�e�\'�5��T�fU�8}�\"��m���/���}Uk�9o��;����|*R?�n��� 3d��g1��y�\\f8gk�����w��=��:/Y7���ۋ�^<�Ō����v#���i����C�#��6\Z�.0�Ua$4�=\Z���;��4����Y=���5���:kpΐq��Ŧ4��X���C��qYߵ-��Lj�����D�f���� �:����(3t��14C��J�#����������WXT���Δy:�^�6�v�7����I�U�Ee��(�p0��ga�6Mj��Sc�,ѫ@��ޅ+R����A��xХ\'6���utǷbۛ��`j�8ؚ�G�IC<KS��5�|�krJ\ry�\\b3xP�����ua�@����$SS�`��tQ.gwW��\r@\'���w�� ��xZ(�>5{� ���dw�>�=J)\r�6t ��X����M���B�\n�ŖT����b>�qg���� 7� �z�n7��vwr�-%u�-Qi�iX1��Ne���A#�v��ӧ�3��?','2010-12-31 13:16:31');
 773+INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:pcache:idoptions:1','E���@ D��`� \"v�ƣ��Wh��,�b�!�⭙7�L+�|}�t ��I�$�<���F\rpSl�4����OJN`\r\Z��� � ծ���)��PY��$�K����գ9�Vjp72��E���c�Wp�2��cVxu7�� ����p#�r=.���[>y)Zp��','2010-12-31 13:16:31');
 774+INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-css:3832ee25d9c44988461f5f339b9b6a48','+�26�Rr�MM�LTH�ɩV\0�Z(��(3�(R�d\r\0','2038-01-19 03:14:07');
 775+INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-css:aa0df16258ad99a1d249e796b5067ed9','+�2��Rr�MM�LTH�ɩN��K-�Q.,�L�NJ,R\0��s򋬔�\r���V�\Z\0','2038-01-19 03:14:07');
 776+INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-js:22814eeadc9cf0a9ebcd844e14198e66','m��r�0 ��y ����r�&Qޡמ!\n�qQ�Xq;}���$��ވ� �c!]]].o5S�\n�)Fq ��L^��?�s�F�!�O�M\\�������\0���N��Ɂ���լ����:��-�j��F��{ۅ�G�\"i�� \Z�6�K����!��Y]=�F[�~竍���䶃����`��9N�Ǵ���@�K��|z�?1�A��@J#_ԁ�7\'�l�1) J�͵�).�3 z�f�T�A���Hњ�[#)�BzRA�7֌��\"T�*~SW���/P���B�Ŏ;\Z�ay�6����+U��?.$�6��-uT�v@h��s�&�����Nإb�fJ�~�]6��p��/q)�>�E�1��͔A\ne�L�g\ZE�`cW�����`fJ�E�a��>��b\n�ӑd�.u�do��[�\nt��b�+���l\Z?X*��Y�(�օ;�L�Jqťɝ���d$�\"�WzG�-@b~+�#�kǞَ�Ƃ~������P)B ����q�Җ2���r�Rl����`z �4�����ÝX�m�;�X݁t;r.�sA��R��y)�kA�\nR�JT��J�U��*�W��_ߟ�4@�vt��f���>����x���','2038-01-19 03:14:07');
 777+INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-js:dd9440c19c575629ac5ec90e489cf62e','+�21�R���Ԕ�����L���Ĕ�\"��ĒT�j��̒T%+���ĔJ�ZMk.%k\0','2038-01-19 03:14:07');
778778 /*!40000 ALTER TABLE `mw_objectcache` ENABLE KEYS */;
779779 UNLOCK TABLES;
780780
@@ -1384,7 +1384,6 @@
13851385 `user_newpassword` tinyblob NOT NULL,
13861386 `user_newpass_time` binary(14) DEFAULT NULL,
13871387 `user_email` tinytext NOT NULL,
1388 - `user_options` blob NOT NULL,
13891388 `user_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
13901389 `user_token` binary(32) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
13911390 `user_email_authenticated` binary(14) DEFAULT NULL,
Index: trunk/phase3/includes/User.php
@@ -1089,8 +1089,10 @@
10901090 $this->mNewpassword = $row->user_newpassword;
10911091 $this->mNewpassTime = wfTimestampOrNull( TS_MW, $row->user_newpass_time );
10921092 $this->mEmail = $row->user_email;
1093 - $this->decodeOptions( $row->user_options );
1094 - $this->mTouched = wfTimestamp(TS_MW,$row->user_touched);
 1093+ if ( isset( $row->user_options ) ) {
 1094+ $this->decodeOptions( $row->user_options );
 1095+ }
 1096+ $this->mTouched = wfTimestamp( TS_MW, $row->user_touched );
10951097 $this->mToken = $row->user_token;
10961098 $this->mEmailAuthenticated = wfTimestampOrNull( TS_MW, $row->user_email_authenticated );
10971099 $this->mEmailToken = $row->user_email_token;
@@ -2693,8 +2695,10 @@
26942696 /**
26952697 * Set this user's options from an encoded string
26962698 * @param $str String Encoded options to import
 2699+ *
 2700+ * @deprecated in 1.19 due to removal of user_options from the user table
26972701 */
2698 - public function decodeOptions( $str ) {
 2702+ private function decodeOptions( $str ) {
26992703 if( !$str )
27002704 return;
27012705
@@ -2822,7 +2826,6 @@
28232827 'user_real_name' => $this->mRealName,
28242828 'user_email' => $this->mEmail,
28252829 'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
2826 - 'user_options' => '',
28272830 'user_touched' => $dbw->timestamp( $this->mTouched ),
28282831 'user_token' => $this->mToken,
28292832 'user_email_token' => $this->mEmailToken,
@@ -2890,7 +2893,6 @@
28912894 'user_email' => $user->mEmail,
28922895 'user_email_authenticated' => $dbw->timestampOrNull( $user->mEmailAuthenticated ),
28932896 'user_real_name' => $user->mRealName,
2894 - 'user_options' => '',
28952897 'user_token' => $user->mToken,
28962898 'user_registration' => $dbw->timestamp( $user->mRegistration ),
28972899 'user_editcount' => 0,
@@ -2924,7 +2926,6 @@
29252927 'user_email' => $this->mEmail,
29262928 'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
29272929 'user_real_name' => $this->mRealName,
2928 - 'user_options' => '',
29292930 'user_token' => $this->mToken,
29302931 'user_registration' => $dbw->timestamp( $this->mRegistration ),
29312932 'user_editcount' => 0,
Index: trunk/phase3/includes/installer/SqliteUpdater.php
@@ -66,6 +66,8 @@
6767 array( 'addTable', 'globaltemplatelinks', 'patch-globaltemplatelinks.sql' ),
6868 array( 'addTable', 'globalnamespaces', 'patch-globalnamespaces.sql' ),
6969 array( 'addTable', 'globalinterwiki', 'patch-globalinterwiki.sql' ),
 70+ array( 'doMigrateUserOptions' ),
 71+ array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ),
7072 );
7173 }
7274
Index: trunk/phase3/includes/installer/DatabaseUpdater.php
@@ -566,4 +566,11 @@
567567 $task = $this->maintenance->runChild( 'UpdateCollation' );
568568 $task->execute();
569569 }
 570+
 571+ protected function doMigrateUserOptions() {
 572+ $cl = $this->maintenance->runChild( 'ConvertUserOptions' );
 573+ $this->output( "Migrating remaining user_options... " );
 574+ $cl->execute();
 575+ $this->output( "done.\n" );
 576+ }
570577 }
Index: trunk/phase3/includes/installer/MysqlUpdater.php
@@ -188,6 +188,9 @@
189189 array( 'addTable', 'globaltemplatelinks', 'patch-globaltemplatelinks.sql' ),
190190 array( 'addTable', 'globalnamespaces', 'patch-globalnamespaces.sql' ),
191191 array( 'addTable', 'globalinterwiki', 'patch-globalinterwiki.sql' ),
 192+ array( 'doMigrateUserOptions' ),
 193+ array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ),
 194+
192195 );
193196 }
194197

Follow-up revisions

RevisionCommit summaryAuthorDate
r98343Followup r98339...reedy18:19, 28 September 2011
r98355Followup r98339...reedy19:28, 28 September 2011
r98357Followup r98339, r98355...reedy19:38, 28 September 2011
r98822Followup r9839, method is now deadedreedy22:46, 3 October 2011
r105878Update GlobalAuth not to just break after r98339 (removing user_options stuff)...reedy14:11, 12 December 2011
r105879Followup r98339, user_options is dead...reedy14:19, 12 December 2011

Comments

#Comment by Brion VIBBER (talk | contribs)   18:15, 28 September 2011

Adding scaptrap, schema keywords.

If there are any remaining unmigrated user_options fields, they need to be migrated or they'll get lost. Schema update itself could be delayed or skipped on production sites, as extra fields are not too evil, but it might be nice to clean up -- if doing other schema updates for 1.19, it should probably be done with them (hence the tag so we don't lose it).

#Comment by Reedy (talk | contribs)   18:22, 28 September 2011

Yup, very true, like you say, no harm being there, but nice to tidy up

I'll log a bug on bugzilla (most likely a TODO for me), to make sure all user_options on wikimedia wikis are dealt with already. I've got a feeling that might have actually already (possibly by Roan), for the usability prep work. At any rate, it doesn't harm to make sure! :)

#Comment by Catrope (talk | contribs)   10:16, 29 September 2011

Now that you mention it, I do believe I've run this when I was on the usability team. I'll dig in the SAL.

#Comment by Catrope (talk | contribs)   10:34, 29 September 2011

August 27, 2010:

15:19 RoanKattouw: convertUserOptions.php runs finished on s2 and s3 (s4-6 finished yesterday after ~5 hrs), s1 still running

#Comment by Reedy (talk | contribs)   11:33, 29 September 2011

Cheers for the confirmation

I'd already checked enwiki, dewiki, frwiki and closed the bug I'd logged on the basis if they're done, so should everywhere else!

#Comment by Platonides (talk | contribs)   23:02, 29 October 2011

What about also dropping the removals of 'user_options' => at User::createNew and User::addToBDatabase in 1.18 ?

They are inserts, so not listing them would give those columns the default value, which should be . And doing that we keep 1.18 forward compatible with 1.19 schema.

#Comment by Platonides (talk | contribs)   23:04, 29 October 2011

Imagine an empty string ('') at the two points where italic begins

#Comment by MarkAHershberger (talk | contribs)   20:56, 6 December 2011

- $this->decodeOptions( $row->user_options ); - $this->mTouched = wfTimestamp(TS_MW,$row->user_touched); + if ( isset( $row->user_options ) ) { + $this->decodeOptions( $row->user_options ); + } + $this->mTouched = wfTimestamp( TS_MW, $row->user_touched );

At least the above snippet, probably the whole diff, needs to be backported to the 1.18 tarball branch since otherwise the errors about user_options not being a member of stdClass will be generated in some cases.

#Comment by Platonides (talk | contribs)   23:27, 6 December 2011

Why? It wouldn't harm backporting that snippet, but doesn't seem to provide a gain. Note that the whole change doing the schema change must not be merged to the branch of the already-released mediawiki 1.18.

#Comment by Tim Starling (talk | contribs)   01:59, 12 December 2011

Appears to break SemanticNotifyMe and auth/GlobalAuth.php. Both are ignorant of the user_properties table, so they were broken anyway, but they will give an SQL error now.

Status & tagging log