View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0020479 | mantisbt | db postgresql | public | 2016-01-05 08:29 | 2016-08-27 17:49 |
Reporter | gthomas | Assigned To | dregad | ||
Priority | normal | Severity | major | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Product Version | 1.3.0-rc.1 | ||||
Target Version | 1.3.0-rc.2 | Fixed in Version | 1.3.0-rc.2 | ||
Summary | 0020479: Error 401 db_query bind params starts with $2 | ||||
Description | APPLICATION ERROR 401 Sikertelen adatbázis-lekérdezés. Az adatbázis hibaüzenete: #-1: ERROR: operator does not exist: smallint = boolean | ||||
Steps To Reproduce | For some users, the login page throws the first error. For non-superuser users, the "View Issues" list produces query where the first bind param is "$2", not "$1". I've implemented a crude hack: renumber the params in db_query. This works, but I don't know how to trace this problem to the root cause. | ||||
Additional Information | See attached patch | ||||
Tags | No tags attached. | ||||
Attached Files | MT20479.patch (1,235 bytes)
diff --git a/core/database_api.php b/core/database_api.php index 9fdca22..15abacc 100644 --- a/core/database_api.php +++ b/core/database_api.php @@ -387,11 +387,30 @@ function db_query( $p_query, array $p_arr_parms = null, $p_limit = -1, $p_offset '%b' => db_param(), '%l' => db_param(), ) ); + log_event( LOG_DATABASE, "q=$p_query" ); + $i = 0; + $p_off = 0; + $t_matches = array(); + $t_query = $p_query; + $t_res = array(); + while( 1 == preg_match('/[$][0-9]+/', $t_query, &$t_matches, PREG_OFFSET_CAPTURE ) ) { + $i++; + $t_res[] = substr( $t_query, 0, $t_matches[0][1] ) . '$' . $i; + $t_query = substr( $t_query, $t_matches[0][1] + strlen( $t_matches[0][0] ) ); + $t_matches = array(); + } + $t_query = implode( "", $t_res ) . $t_query; + if( 0 != strcmp( $p_query, $t_query ) ) { + log_event( LOG_DATABASE, "!!! $p_query\n<>\n$t_query" ); + $p_query = $t_query; + } if( db_is_oracle() ) { $p_query = db_oracle_adapt_query_syntax( $p_query, $p_arr_parms ); } + log_event( LOG_DATABASE, "Q=$p_query P=" . var_export( $p_arr_parms, TRUE ) ); + if( ( $p_limit != -1 ) || ( $p_offset != -1 ) ) { $t_result = $g_db->SelectLimit( $p_query, $p_limit, $p_offset, $p_arr_parms ); } else { MT20479-detailed_error.html (16,547 bytes)
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title>AEGON UNO-SOFT hibakövető</title> <link rel="stylesheet" type="text/css" href="https://www.unosoft.hu/mantis/aegon/css/default.css" /> <link rel="stylesheet" type="text/css" href="https://www.unosoft.hu/mantis/aegon/css/jquery-ui-1.11.4.min.css" /> <link rel="stylesheet" type="text/css" href="https://www.unosoft.hu/mantis/aegon/css/common_config.php" /> <link rel="stylesheet" type="text/css" href="https://www.unosoft.hu/mantis/aegon/css/status_config.php" /> <link rel="shortcut icon" href="/mantis/aegon/images/favicon.ico" type="image/x-icon" /> <link rel="search" type="application/opensearchdescription+xml" title="MantisBT: Text Search" href="https://www.unosoft.hu/mantis/aegon/browser_search_plugin.php?type=text" /> <link rel="search" type="application/opensearchdescription+xml" title="MantisBT: Issue Id" href="https://www.unosoft.hu/mantis/aegon/browser_search_plugin.php?type=id" /> <script type="text/javascript" src="/mantis/aegon/javascript_config.php"></script> <script type="text/javascript" src="/mantis/aegon/javascript_translations.php"></script> <script type="text/javascript" src="/mantis/aegon/javascript/jquery-1.11.3.min.js"></script> <script type="text/javascript" src="/mantis/aegon/javascript/jquery-ui-1.11.4.min.js"></script> <script type="text/javascript" src="/mantis/aegon/javascript/common.js"></script> <script type="text/javascript" src="/mantis/aegon/javascript/bugFilter.js"></script> </head> <body> <div id="mantis"> <div id="banner"><a id="logo-link" href="my_view_page.php"><img id="logo-image" alt="AEGON UNO-SOFT hibakövető" src="/mantis/aegon/config/mantis_logo.png" /></a></div><div id="error-msg"><div class="error-type">APPLICATION ERROR #401</div><div class="error-description">Sikertelen adatbázis-lekérdezés. Az adatbázis hibaüzenete: #-1: ERROR: could not determine data type of parameter $1 a következő lekérdezéshez: SELECT p.id, p.name, ph.parent_id<br /> FROM mantis_project_table p<br /> LEFT JOIN mantis_project_user_list_table u<br /> ON p.id=u.project_id AND u.user_id=$2<br /> LEFT JOIN mantis_project_hierarchy_table ph<br /> ON ph.child_id = p.id<br /> WHERE p.enabled = $3 AND <br /> ( p.view_state=$4<br /> OR (p.view_state=$5<br /> AND<br /> u.user_id=$6 )<br /> ) ORDER BY p.name</div><div class="error-info">Kérjük, használja a böngészője "Vissza" gombját az előző oldalhoz való visszatéréshez. Ott kijavíthatja az imént felismert hibákat, vagy más műveletet választhat. A menüből szintén választhat egy pontot, ha közvetlenül az adott funkcióhoz szeretne jutni.</div><div class="error-details"> <table class="width90"> <tr> <td>Full path: /home/aegon/prd/mantis/core/database_api.php</td> </tr> <tr> <td>Line: 469</td> </tr> <tr> <td> <table class="width100" style="table-layout:fixed;"><tr><th>Variable</th><th>Value</th><th>Type</th></tr><tr><td style="width=20%; word-wrap:break-word; overflow:auto;">p_query</td><td style="width=70%; word-wrap:break-word; overflow:auto;">SELECT p.id, p.name, ph.parent_id FROM mantis_project_table p LEFT JOIN mantis_project_user_list_table u ON p.id=u.project_id AND u.user_id=$2 LEFT JOIN mantis_project_hierarchy_table ph ON ph.child_id = p.id WHERE p.enabled = $3 AND ( p.view_state=$4 OR (p.view_state=$5 AND u.user_id=$6 ) ) ORDER BY p.name</td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">p_limit</td><td style="width=70%; word-wrap:break-word; overflow:auto;">-1</td><td style="width=10%;">integer</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">p_offset</td><td style="width=70%; word-wrap:break-word; overflow:auto;">-1</td><td style="width=10%;">integer</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">g_db_log_queries</td><td style="width=70%; word-wrap:break-word; overflow:auto;"></td><td style="width=10%;">boolean</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">t_db_type</td><td style="width=70%; word-wrap:break-word; overflow:auto;">pgsql</td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">s_check_params</td><td style="width=70%; word-wrap:break-word; overflow:auto;">1</td><td style="width=10%;">boolean</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">t_start</td><td style="width=70%; word-wrap:break-word; overflow:auto;">1452023715.1661</td><td style="width=10%;">double</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">t_params</td><td style="width=70%; word-wrap:break-word; overflow:auto;">5</td><td style="width=10%;">integer</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">i</td><td style="width=70%; word-wrap:break-word; overflow:auto;">5</td><td style="width=10%;">integer</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">s_prefix</td><td style="width=70%; word-wrap:break-word; overflow:auto;">mantis_</td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">s_suffix</td><td style="width=70%; word-wrap:break-word; overflow:auto;">_table</td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">p_off</td><td style="width=70%; word-wrap:break-word; overflow:auto;">0</td><td style="width=10%;">integer</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">t_query</td><td style="width=70%; word-wrap:break-word; overflow:auto;">SELECT p.id, p.name, ph.parent_id FROM mantis_project_table p LEFT JOIN mantis_project_user_list_table u ON p.id=u.project_id AND u.user_id=$1 LEFT JOIN mantis_project_hierarchy_table ph ON ph.child_id = p.id WHERE p.enabled = $2 AND ( p.view_state=$3 OR (p.view_state=$4 AND u.user_id=$5 ) ) ORDER BY p.name</td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">t_result</td><td style="width=70%; word-wrap:break-word; overflow:auto;"></td><td style="width=10%;">boolean</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">t_elapsed</td><td style="width=70%; word-wrap:break-word; overflow:auto;">0.0004</td><td style="width=10%;">string</td></tr> <tr><td colspan="3" style="word-wrap:break-word"><br /><strong>p_arr_parms</strong></td></tr><tr><td colspan="3"><table class="width100" style="table-layout:fixed;"><tr><th>Variable</th><th>Value</th><th>Type</th></tr><tr><td style="width=20%; word-wrap:break-word; overflow:auto;">0</td><td style="width=70%; word-wrap:break-word; overflow:auto;">180</td><td style="width=10%;">integer</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">1</td><td style="width=70%; word-wrap:break-word; overflow:auto;">1</td><td style="width=10%;">boolean</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">2</td><td style="width=70%; word-wrap:break-word; overflow:auto;">10</td><td style="width=10%;">integer</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">3</td><td style="width=70%; word-wrap:break-word; overflow:auto;">50</td><td style="width=10%;">integer</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">4</td><td style="width=70%; word-wrap:break-word; overflow:auto;">180</td><td style="width=10%;">integer</td></tr> </table></td></tr><tr><td colspan="3" style="word-wrap:break-word"><br /><strong>g_queries_array</strong></td></tr><tr><td colspan="3"><table class="width100" style="table-layout:fixed;"><tr><th>Variable</th><th>Value</th><th>Type</th></tr><tr><td colspan="3" style="word-wrap:break-word"><br /><strong>1</strong></td></tr><tr><td colspan="3"><table class="width100" style="table-layout:fixed;"><tr><th>Variable</th><th>Value</th><th>Type</th></tr><tr><td style="width=20%; word-wrap:break-word; overflow:auto;">0</td><td style="width=70%; word-wrap:break-word; overflow:auto;"></td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">1</td><td style="width=70%; word-wrap:break-word; overflow:auto;">0.0012</td><td style="width=10%;">string</td></tr> </table></td></tr><tr><td colspan="3" style="word-wrap:break-word"><br /><strong>2</strong></td></tr><tr><td colspan="3"><table class="width100" style="table-layout:fixed;"><tr><th>Variable</th><th>Value</th><th>Type</th></tr><tr><td style="width=20%; word-wrap:break-word; overflow:auto;">0</td><td style="width=70%; word-wrap:break-word; overflow:auto;"></td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">1</td><td style="width=70%; word-wrap:break-word; overflow:auto;">0.0005</td><td style="width=10%;">string</td></tr> </table></td></tr><tr><td colspan="3" style="word-wrap:break-word"><br /><strong>3</strong></td></tr><tr><td colspan="3"><table class="width100" style="table-layout:fixed;"><tr><th>Variable</th><th>Value</th><th>Type</th></tr><tr><td style="width=20%; word-wrap:break-word; overflow:auto;">0</td><td style="width=70%; word-wrap:break-word; overflow:auto;"></td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">1</td><td style="width=70%; word-wrap:break-word; overflow:auto;">0.0004</td><td style="width=10%;">string</td></tr> </table></td></tr><tr><td colspan="3" style="word-wrap:break-word"><br /><strong>4</strong></td></tr><tr><td colspan="3"><table class="width100" style="table-layout:fixed;"><tr><th>Variable</th><th>Value</th><th>Type</th></tr><tr><td style="width=20%; word-wrap:break-word; overflow:auto;">0</td><td style="width=70%; word-wrap:break-word; overflow:auto;"></td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">1</td><td style="width=70%; word-wrap:break-word; overflow:auto;">0.0006</td><td style="width=10%;">string</td></tr> </table></td></tr><tr><td colspan="3" style="word-wrap:break-word"><br /><strong>5</strong></td></tr><tr><td colspan="3"><table class="width100" style="table-layout:fixed;"><tr><th>Variable</th><th>Value</th><th>Type</th></tr><tr><td style="width=20%; word-wrap:break-word; overflow:auto;">0</td><td style="width=70%; word-wrap:break-word; overflow:auto;"></td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">1</td><td style="width=70%; word-wrap:break-word; overflow:auto;">0.0004</td><td style="width=10%;">string</td></tr> </table></td></tr><tr><td colspan="3" style="word-wrap:break-word"><br /><strong>6</strong></td></tr><tr><td colspan="3"><table class="width100" style="table-layout:fixed;"><tr><th>Variable</th><th>Value</th><th>Type</th></tr><tr><td style="width=20%; word-wrap:break-word; overflow:auto;">0</td><td style="width=70%; word-wrap:break-word; overflow:auto;"></td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">1</td><td style="width=70%; word-wrap:break-word; overflow:auto;">0.0004</td><td style="width=10%;">string</td></tr> </table></td></tr><tr><td colspan="3" style="word-wrap:break-word"><br /><strong>7</strong></td></tr><tr><td colspan="3"><table class="width100" style="table-layout:fixed;"><tr><th>Variable</th><th>Value</th><th>Type</th></tr><tr><td style="width=20%; word-wrap:break-word; overflow:auto;">0</td><td style="width=70%; word-wrap:break-word; overflow:auto;"></td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">1</td><td style="width=70%; word-wrap:break-word; overflow:auto;">0.0006</td><td style="width=10%;">string</td></tr> </table></td></tr><tr><td colspan="3" style="word-wrap:break-word"><br /><strong>8</strong></td></tr><tr><td colspan="3"><table class="width100" style="table-layout:fixed;"><tr><th>Variable</th><th>Value</th><th>Type</th></tr><tr><td style="width=20%; word-wrap:break-word; overflow:auto;">0</td><td style="width=70%; word-wrap:break-word; overflow:auto;"></td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">1</td><td style="width=70%; word-wrap:break-word; overflow:auto;">0.0017</td><td style="width=10%;">string</td></tr> </table></td></tr><tr><td colspan="3" style="word-wrap:break-word"><br /><strong>9</strong></td></tr><tr><td colspan="3"><table class="width100" style="table-layout:fixed;"><tr><th>Variable</th><th>Value</th><th>Type</th></tr><tr><td style="width=20%; word-wrap:break-word; overflow:auto;">0</td><td style="width=70%; word-wrap:break-word; overflow:auto;"></td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">1</td><td style="width=70%; word-wrap:break-word; overflow:auto;">0.0004</td><td style="width=10%;">string</td></tr> </table></td></tr></table></td></tr><tr><td colspan="3" style="word-wrap:break-word"><br /><strong>t_matches</strong></td></tr><tr><td colspan="3"><table class="width100" style="table-layout:fixed;"><tr><th>Variable</th><th>Value</th><th>Type</th></tr></table></td></tr><tr><td colspan="3" style="word-wrap:break-word"><br /><strong>t_res</strong></td></tr><tr><td colspan="3"><table class="width100" style="table-layout:fixed;"><tr><th>Variable</th><th>Value</th><th>Type</th></tr><tr><td style="width=20%; word-wrap:break-word; overflow:auto;">0</td><td style="width=70%; word-wrap:break-word; overflow:auto;">SELECT p.id, p.name, ph.parent_id FROM mantis_project_table p LEFT JOIN mantis_project_user_list_table u ON p.id=u.project_id AND u.user_id=$1</td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">1</td><td style="width=70%; word-wrap:break-word; overflow:auto;"> LEFT JOIN mantis_project_hierarchy_table ph ON ph.child_id = p.id WHERE p.enabled = $2</td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">2</td><td style="width=70%; word-wrap:break-word; overflow:auto;"> AND ( p.view_state=$3</td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">3</td><td style="width=70%; word-wrap:break-word; overflow:auto;"> OR (p.view_state=$4</td><td style="width=10%;">string</td></tr> <tr><td style="width=20%; word-wrap:break-word; overflow:auto;">4</td><td style="width=70%; word-wrap:break-word; overflow:auto;"> AND u.user_id=$5</td><td style="width=10%;">string</td></tr> </table></td></tr></table> </td> </tr> </table> </div><div class="error-trace"><table class="width90"><tr><th>Filename</th><th>Line</th><th></th><th></th><th>Function</th><th>Args</th></tr><tr class="row-1"><td>/home/aegon/prd/mantis/core/database_api.php</td><td>469</td><td>-</td><td>-</td><td>trigger_error</td><td>( <string>'401', <integer>256 )</td></tr><tr class="row-2"><td>/home/aegon/prd/mantis/core/user_api.php</td><td>991</td><td>-</td><td>-</td><td>db_query</td><td>( <string>'SELECT p.id, p.name, ph.parent_id FROM {project} p LEFT JOIN {project_user_list} u ON p.id=u.project_id AND u.user_id=$2 LEFT JOIN {project_hierarchy} ph ON ph.child_id = p.id WHERE p.enabled = $3 AND ( p.view_state=$4 OR (p.view_state=$5 AND u.user_id=$6 ) ) ORDER BY p.name', <array> { [0] => 180, [1] => true, [2] => 10, [3] => 50, [4] => 180 } )</td></tr><tr class="row-1"><td>/home/aegon/prd/mantis/core/filter_api.php</td><td>1196</td><td>-</td><td>-</td><td>user_get_accessible_projects</td><td>( <integer>180 )</td></tr><tr class="row-2"><td>/home/aegon/prd/mantis/view_all_bug_page.php</td><td>71</td><td>-</td><td>-</td><td>filter_get_bug_rows</td><td>( <integer>1, <NULL>NULL, <NULL>NULL, <NULL>NULL, <NULL>NULL, <NULL>NULL, <NULL>NULL, <boolean>true )</td></tr></table></div></div></div> </body> </html> | ||||
related to | 0020483 | closed | cproensa | Error 401 with PostgreSQL manage_user_page |
related to | 0014398 | closed | dregad | Support for PostgreSQL broken in 1.3 |
has duplicate | 0020896 | closed | cproensa | APPLICATION ERROR 0000401 with view Issues - all Projects |
related to | 0021649 | closed | cproensa | Remove incorrectly placed db_param_push() |
Ok, uploaded the patch (format has been dismissed...). |
|
Edited the additional info field to point to attachment. Looking at the error message, it seems you're using PostgreSQL, is this correct ? It would be helpful if you could actually provide reproducible steps as I'm not able to reproduce the behavior on my dev box. Maybe you can enable detailed errors reporting and post output here (after masking sensitive info if any), this way we get the call stack and variables. |
|
Thanks Damian! Yes, it is PostgreSQL, v8.4. I've attached the detailed report. |
|
I am not using PostgreSQL, but i could find one trace that calls for db_param, for first time while building the query, but the param count was already 1. The call stack was:
Apparently, the upper callers were not building sql querys, so its not a case of nested builds I am thinking of two issues: |
|
I managed to reproduce a similar situation: Given projects A,B APPLICATION ERROR 0000401 Call trace:
The problem is: So, to fix this, we may need to chase a lot of api functions that performs sql queries to add a db_param_push(). |
|
You're absolutely right. I created that API call exactly for that purpose, as I faced the same issue with PostgreSQL (and Oracle too) in another part of the application (I think it was custom fields). To be perfectly clean, every single API executing SQL queries should make use of this, but it was too much effort go through the code and check functions one-by-one. |
|
I would appreciate if you could download the code from the mentioned pull request, and give it a test run to see if it resolves the issues you've encountered.
There is a global variable in database API ($g_db_param), which acts like a stack. Everytime db_param() is called, the param count is incremented, and when the query is executed (calling db_query()), the count is reset to its previous value (or 0 if there is none). |
|
Thanks @cproense and @dregad! I'll try the PR, but why do we use $number at all? With a global variable, this is very error prone. Why not just a "?" or "<PLACEHOLDER>" or anything, and use a replacer (just as I did) just before execution? We already have such function for Oracle, already! |
|
As far as I could test it (only with specific users), f54b2de02e371e93624bb51d674ba24d0f1d1b06 solves this problem. |
|
PR https://github.com/mantisbt/mantisbt/pull/705 has been rebased. |
|
MantisBT: master b6f81949 2016-05-21 00:19 Details Diff |
Consistently push query params in all APIs Fixes 0020479, https://github.com/mantisbt/mantisbt/pull/705 |
Affected Issues 0020479 |
|
mod - core/access_api.php | Diff File | ||
mod - core/api_token_api.php | Diff File | ||
mod - core/authentication_api.php | Diff File | ||
mod - core/billing_api.php | Diff File | ||
mod - core/bug_api.php | Diff File | ||
mod - core/bug_revision_api.php | Diff File | ||
mod - core/bugnote_api.php | Diff File | ||
mod - core/category_api.php | Diff File | ||
mod - core/cfdefs/cfdef_standard.php | Diff File | ||
mod - core/config_api.php | Diff File | ||
mod - core/custom_field_api.php | Diff File | ||
mod - core/database_api.php | Diff File | ||
mod - core/email_api.php | Diff File | ||
mod - core/email_queue_api.php | Diff File | ||
mod - core/file_api.php | Diff File | ||
mod - core/filter_api.php | Diff File | ||
mod - core/history_api.php | Diff File | ||
mod - core/install_helper_functions_api.php | Diff File | ||
mod - core/news_api.php | Diff File | ||
mod - core/plugin_api.php | Diff File | ||
mod - core/print_api.php | Diff File | ||
mod - core/profile_api.php | Diff File | ||
mod - core/project_api.php | Diff File | ||
mod - core/project_hierarchy_api.php | Diff File | ||
mod - core/relationship_api.php | Diff File | ||
mod - core/sponsorship_api.php | Diff File | ||
mod - core/summary_api.php | Diff File | ||
mod - core/tag_api.php | Diff File | ||
mod - core/tokens_api.php | Diff File | ||
mod - core/user_api.php | Diff File | ||
mod - core/user_pref_api.php | Diff File | ||
mod - core/version_api.php | Diff File | ||
MantisBT: master f3ab14c5 2016-05-23 01:54 Details Diff |
Use correct function name db_param_push() Commit fbc379faaf27e6b853c8b08ac380834836b81032 referenced the wrong name db_push_param(). Issue 0020479 |
Affected Issues 0020479 |
|
mod - core/user_api.php | Diff File |