Derby
  1. Derby
  2. DERBY-4407

StringIndexOutOfBoundsException in ij when result has no columns

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 10.6.1.0
    • Fix Version/s: 10.6.1.0
    • Component/s: SQL
    • Labels:
      None
    • Issue & fix info:
      Repro attached

      Description

      A query that returns no columns should perhaps raise an SQLException of some kind, I don't know, but currently it doesn't, and ij fails with a StringIndexOutOfBoundsException when it tries to display the result.

      After DERBY-4370 it is possible to construct queries that return no columns by having a select list like T1.* in a join where the USING clause contains all of T1's columns. To reproduce:

      ij> create table t(x int);
      0 rows inserted/updated/deleted
      ij> insert into t values (1),(2),(3);
      3 rows inserted/updated/deleted
      ij> select t1.* from t t1 join t t2 using ;
      JAVA ERROR: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
      java.lang.StringIndexOutOfBoundsException: String index out of range: -1
      at java.lang.AbstractStringBuilder.setLength(AbstractStringBuilder.java:143)
      at java.lang.StringBuffer.setLength(StringBuffer.java:153)
      at org.apache.derby.tools.JDBCDisplayUtil.indent_DisplayBanner(JDBCDisplayUtil.java:627)
      at org.apache.derby.tools.JDBCDisplayUtil.indent_DisplayResults(JDBCDisplayUtil.java:368)
      at org.apache.derby.tools.JDBCDisplayUtil.indent_DisplayResults(JDBCDisplayUtil.java:338)
      at org.apache.derby.tools.JDBCDisplayUtil.indent_DisplayResults(JDBCDisplayUtil.java:241)
      at org.apache.derby.tools.JDBCDisplayUtil.DisplayResults(JDBCDisplayUtil.java:229)
      at org.apache.derby.impl.tools.ij.utilMain.displayResult(utilMain.java:448)
      at org.apache.derby.impl.tools.ij.utilMain.doCatch(utilMain.java:522)
      at org.apache.derby.impl.tools.ij.utilMain.runScriptGuts(utilMain.java:363)
      at org.apache.derby.impl.tools.ij.utilMain.go(utilMain.java:261)
      at org.apache.derby.impl.tools.ij.Main.go(Main.java:229)
      at org.apache.derby.impl.tools.ij.Main.mainCore(Main.java:184)
      at org.apache.derby.impl.tools.ij.Main.main(Main.java:75)
      at org.apache.derby.tools.ij.main(ij.java:59)
      at org.apache.derby.iapi.tools.run.main(run.java:53)

      1. d4407-1a.diff
        4 kB
        Knut Anders Hatlen

        Issue Links

          Activity

          Hide
          Rick Hillegas added a comment - - edited

          Hi Knut,

          I think that a row returned by a query must have at least one column. Here's how I thread my way to this conclusion by reading part 2 of the SQL Standard:

          1) The result set returned by a query expression is a kind of table called a "derived table" according to 4.14.2 "Types of tables".

          2) A row in a table must have at least one column according to the previous section, 4.14.1 "Introduction to tables"

          Show
          Rick Hillegas added a comment - - edited Hi Knut, I think that a row returned by a query must have at least one column. Here's how I thread my way to this conclusion by reading part 2 of the SQL Standard: 1) The result set returned by a query expression is a kind of table called a "derived table" according to 4.14.2 "Types of tables". 2) A row in a table must have at least one column according to the previous section, 4.14.1 "Introduction to tables"
          Hide
          Knut Anders Hatlen added a comment -

          Thanks Rick. That sounds reasonable. So I guess a bind-time exception would be in order here, then.
          Changing component from Tools to SQL, since the fix will have to go into the engine.

          Show
          Knut Anders Hatlen added a comment - Thanks Rick. That sounds reasonable. So I guess a bind-time exception would be in order here, then. Changing component from Tools to SQL, since the fix will have to go into the engine.
          Hide
          Knut Anders Hatlen added a comment -

          The attached patch adds a check for empty result column list in SelectNode at the same place where we check whether the result column list is too long. All the regression tests ran cleanly.

          Show
          Knut Anders Hatlen added a comment - The attached patch adds a check for empty result column list in SelectNode at the same place where we check whether the result column list is too long. All the regression tests ran cleanly.
          Hide
          Knut Anders Hatlen added a comment -

          Committed revision 826616.

          Show
          Knut Anders Hatlen added a comment - Committed revision 826616.

            People

            • Assignee:
              Knut Anders Hatlen
              Reporter:
              Knut Anders Hatlen
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development