Hello, may I ask how this situation differs from upgrading DBD::Pg to version 3.3.0 or DBD::SQLite to version 1.43_04? What you are writing there basically affects also DBD::SQLite... And version 1.43_04 was already released...
On Tuesday 19 September 2017 14:46:09 Night Light wrote: > Dear Perl gurus, > > This is my first post. I'm using Perl with great joy, and I'd like to > express my gratitude for all you are doing to keep Perl stable and > fun to use. > > I'd like to ask to object to re-releasing this version and discuss on > how to make 4.043 backwards compatible instead. > This change will with 100% certainty corrupt all BLOB data written to > the database when the developer did not read the release notes > before applying the latest version of DBD::mysql (and changed its > code consequently). Knowing that sysadmins have the habit of not > always reading the release notes of each updated package the > likelihood that this will happen will therefore high. > I myself wasn't even shown the release notes as it was a dependency > of an updated package that I applied. > The exposure of this change is big as DBD::mysql affects multiple > applications and many user bases. > I believe deliberately introducing industry wide database corruption > is something that will significantly harm peoples confidence in > using Perl. I believe that not providing backwards compatibility is > not in line with the Perl policy that has been carefully put > together by the community to maintain the quality of Perl as it is > today. > http://perldoc.perl.org/perlpolicy.html#BACKWARD-COMPATIBILITY-AND-DE > PRECATION > > I therefore believe the only solution is an upgrade that is by > default backwards compatible, and where it is the user who decides > when to start UTF8 encode the input values of a SQL request instead. > If it is too time consuming or too difficult it should be considered > to park the UTF8-encoding "fix" and release a version with the > security fix first. > > I have the following objections against this release: > > 1. the upgrade will corrupt more records than it fixes (it does more > harm than good) > 2. the reason given for not providing backward compatibility > ("because it was hard to implement") is not plausible given the > level of unwanted side effects. > This especially knowing that there is already a mechanism in place > to signal if its wants UTF8 encoding or not > (mysql_enable_utf8/mysql_enable_utf8mb4). > 3. it costs more resources to coordinate/discuss a "way forward" or > options than to implement a solution that addresses backwards > compatibility 4. it is unreasonable to ask for changing existing > source knowing that depending modules may not be actively maintained > or proprietary It can be argued that such module should always be > maintained but it does not change the fact that a good running Perl > program becomes unusable 5. it does not inform the user that after > upgrading existing code will start write corrupt BLOB records > 6. it does not inform the user about the fact that a code review of > all existing code is necessary, and how it needs to be changed and > tested 7. it does not give the user the option to decide how the > BLOB's should be stored/encoded (opt in) > 8. it does not provide backwards compatibility > By doing so it does not respect the Perl policy that has been > carefully put together by the community to maintain the quality of > Perl as it is today. > > http://perldoc.perl.org/perlpolicy.html#BACKWARD-COMPATIBILITY-AND-DE > PRECATION 9. it blocks users from using DBD::mysql upgrades as long > as they have not rewritten their existing code > 10. not all users from DBD::mysql can be warned beforehand about the > side effects as it is not known which private parties have code that > use DBD::mysql > 12. I believe development will go faster when support for backwards > compatibility is addressed > 13. having to write 1 extra line for each SQL query value is a monks > job that will make the module less attractive to use > > About forking to DBD::mariadb?: > The primary reason to create such a module is when the communication > protocol of Mariadb has become incompatible with Mysql. > To use this namespace to fix a bug in DBD::mysql does not meet that > criteria and causes confusion for developers and unnecessary > pollution of the DBD namespace. > > --- > > For people that do not know the impact of the change that is pending > to be committed: > (see Github issue that includes 3 reports of companies that suffered > data loss https://github.com/perl5-dbi/DBD-mysql/issues/117 ) > > Issue: some UTF8 characters are not properly displayed after > retrieval Cause: SQL query values are not UTF8 encoded when sent to > the database but they are all decoded once retrieved. > Occurence: Only records with string data that can only be written > with UTF8. It can be considered rare as people haven't reported this > issue after 10 years of usage. > Regional impact: Only affects countries which characters need UTF8 > encoding and only affects string values. > Steps to recover from it: Read string data unencoded and write it > encoded. > > Changes of upgrade pending to be re-released: > SQL query values are both UTF8 encoded when sent to the database as > when its retrieved (including BLOB fields). > BLOB fields will be excluded from encoding only if you specify its > data type. > > Side effects from installing upgrade: > - BLOB data will be written after UTF8 encoding and will therefore be > corrupt > - no possibility to detect if a BLOB field is corrupt or not. Only > when known when the INSERT/UPDATE took place, and when the upgrade > was installed - existing data will still display incorrect > > Occurence: every INSERT/UPDATE statement will start writing corrupted > BLOB data > Regional impact: worldwide > Steps to recover from it corrupted BLOBs? You cannot. Your binary > blobs are encoded as if they were UTF8 strings. Your binary data is > unrecoverable (as in "gone forever"). > If you are a dentist you have to ask your customers to come back to > make another x-ray as the made photo's are gone. > > What is asked from the developer to prevent this from happening? > - do not miss reading the release notes before upgrading > - review all source code (including written by other included > modules) and specify the data type of each SQL parameter value > before: $dbh->do('INSERT INTO test (BLOB1,BLOB2,BLOB3,BLOB4) > VALUES(?,?,?,?)',undef,$col1,$col2,$col3); > after: $dbh->do('INSERT INTO test (BLOB1,BLOB2,BLOB3,BLOB4) > VALUES(?,?,?,?)'); > $sth->bind_param(1, $file, SQL_BLOB); > $sth->bind_param(2, $file, SQL_BLOB); > $sth->bind_param(3, $file, SQL_BLOB); > ... > One line more for each SQL statement. This will be a time consuming > monks task during which the user will ask why this is necessary > while it worked before. > - upgrade scripts need to be written to UTF8 encode existing string > data - retest all source code