I believe I am having the same problem as you, Masood. It seems to not be related to the PowerDNS version but rather to the version of MySQL.

Using stored procedures with the pdns MySQL backend works fine for me on Debian Stretch with MariaDB 10.1 on pdns versions 4.0.3, 4.1.6, and 4.3.0.

I should note that the Debian version of 4.0.3 contains a backported fix for dealing with stored procedures, which is native in 4.1.6 and 4.3.0: https://github.com/Habbie/pdns/commit/d64a77e368495132d92833f4ab2bc91b647d2beb Without this fix, 4.0.3 wouldn't be able to deal with stored procedures at all. I believe that Masood is also using this Debian version of 4.0.3.

The other two versions, 4.1.6 and 4.3.0, I compiled myself on Stretch (oldstable) from sources in Debian Buster (stable) and Debian Bullseye (testing), respectively.

When I move from MariaDB 10.1 to MariaDB 10.2 (or greater), all three pdns versions fail with the "Prepared statement contains no metadata" error. Masood's experience leads me to believe that the same breakage happened between MySQL 5.6 and 5.7.


There are two places in smysql.cc where the same error, "Could not bind parameters to mysql statement", can be thrown. I have found that in this case, it's the second one (the one near the comment "For some reason mysql_stmt_result_metadata returns NULL here") which is causing the problem.

I'm afraid I don't know enough about MySQL development in C++ to know what to do here. Can anyone shine any light?

This is the relevant code (pardon the word wrapping):

#if MYSQL_VERSION_ID >= 50500
     if (d_residx >= d_resnum) {
       mysql_stmt_free_result(d_stmt);
       while(!mysql_stmt_next_result(d_stmt)) {
         if ((err = mysql_stmt_store_result(d_stmt))) {
           string error(mysql_stmt_error(d_stmt));
           releaseStatement();
throw SSqlException("Could not store mysql statement while processing additional sets: " + d_query + string(": ") + error);
         }
         d_resnum = mysql_stmt_num_rows(d_stmt);
// XXX: For some reason mysql_stmt_result_metadata returns NULL here, so we cannot
         // ensure row field count matches first result set.
         if (d_resnum > 0) { // ignore empty result set
if (d_res_bind != nullptr && (err = mysql_stmt_bind_result(d_stmt, d_res_bind))) {
             string error(mysql_stmt_error(d_stmt));
             releaseStatement();
throw SSqlException("Could not bind parameters to mysql statement: " + d_query + string(": ") + error);
           }
           d_residx = 0;
           break;
         }
         mysql_stmt_free_result(d_stmt);
       }
     }
#endif
_______________________________________________
Pdns-users mailing list
Pdns-users@mailman.powerdns.com
https://mailman.powerdns.com/mailman/listinfo/pdns-users

Reply via email to