Uploaded image for project: 'MariaDB Connector/J'
  1. MariaDB Connector/J
  2. CONJ-526

Wrong error message when calling ParameterMetaData getParameterCount() with incorrect SQL in PreparedStatement

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed (View Workflow)
    • Priority: Minor
    • Resolution: Fixed
    • Affects Version/s: 2.1.1
    • Fix Version/s: 1.6.5, 2.1.2
    • Component/s: Other
    • Labels:
      None

      Description

      When calling getParameterCount() from the ParameterMetaData of a PreparedStatement with incorrect SQL, it fails with "Parameter metadata not available for these statement" instead of "You have an error in your SQL syntax; ..."

      For example:
      Executing query:

      S1ELECT * from duala WHERE a = ?
      

      fails with

      java.sql.SQLException: Parameter metadata not available for these statement
      

      Corrected version:

      S1ELECT * from duala WHERE a = ?
      

      fails with

      java.sql.SQLSyntaxErrorException: (conn=20657507) Error preparing query: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'S1ELECT * from duala WHERE a = ?' at line 1
      

      Attached example:

      	PreparedStatement pstmt = connection.prepareStatement(sql);
      	final ParameterMetaData pmd = pstmt.getParameterMetaData();
      	//wrong error message:
      	final int count = pmd.getParameterCount();
      

      I think one possible workaround is to change setParametersData() method in
      class org.mariadb.jdbc.MariaDbPreparedStatementClient to capture SQLSyntaxErrorException and to rethrow it

      private void setParametersData() throws SQLSyntaxErrorException {
      	try (MariaDbPreparedStatementServer ssps = new MariaDbPreparedStatementServer(connection, this.sqlQuery,
      			ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY, Statement.NO_GENERATED_KEYS)) {
      		resultSetMetaData = ssps.getMetaData();
      		parameterMetaData = ssps.getParameterMetaData();
      	} catch (SQLSyntaxErrorException sqlsse) {
      		// syntax error thrown
      		throw sqlsse;
      	} catch (SQLException sqle) {
      		//if statement cannot be prepared
      		parameterMetaData = new MariaDbParameterMetaData(null);
      	}
      }
      

        Attachments

          Activity

            People

            Assignee:
            diego dupin Diego Dupin
            Reporter:
            rafalopez79 Rafael Lopez Fernández
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Dates

              Created:
              Updated:
              Resolved: