Back to Jsqlparser

Migration to 4.7

src/site/sphinx/migration47.rst

latest12.3 KB
Original Source

Migration to 4.7


The new version of JSQLParser 4.7 is a rewrite in order to simplify accessing the SQL's Abstract Syntax Tree (AST). Quite a few redundant classes have been removed or merged.

As always, such a major improvement comes at a certain cost, which is breaking the previous API. Following the guidance below, the new API can be adopted easily although you are welcome to lodge a support request when any questions or concerns arise.

Values Clause

The ValueListExpression has been replaced by Values, which implements Select Statement and Expression.

The ValuesStatement has been replaced by Values, which implements Select Statement and Expression.

.. tab:: Statement

.. code-block:: SQL

    VALUES ( 1, 2, 3 )
    ;


.. code-block:: TEXT

    SQL Text
     └─Statements: statement.select.Values
        └─ParenthesedExpressionList: (1, 2, 3)


.. code-block:: JAVA

    Values values = (Values) CCJSqlParserUtil.parse(sqlStr);
    assertEquals( 3, values.getExpressions().size() );

.. tab:: Sub-query

.. code-block:: SQL

    SELECT *
    FROM ( VALUES 1, 2, 3 )
    ;


.. code-block:: TEXT

    SQL Text
     └─Statements: statement.select.PlainSelect
        ├─selectItems: statement.select.SelectItem
        │  └─AllColumns: *
        └─fromItem: statement.select.ParenthesedSelect
           └─select: statement.select.Values
              └─ExpressionList: 1, 2, 3


.. code-block:: JAVA

    PlainSelect select = (PlainSelect)  CCJSqlParserUtil.parse(sqlStr);
    ParenthesedSelect subSelect = (ParenthesedSelect) select.getFromItem();
    Values values = (Values) subSelect.getSelect();
    assertEquals( 3, values.getExpressions().size() );

.. tab:: Expression

.. code-block:: SQL

    UPDATE test
    SET (   a
            , b
            , c ) = ( VALUES 1, 2, 3 )
    ;


.. code-block:: TEXT

    SQL Text
     └─Statements: statement.update.Update
        ├─Table: test
        └─updateSets: statement.update.UpdateSet
           ├─ParenthesedExpressionList: (a, b, c)
           └─ExpressionList: (VALUES 1, 2, 3)


.. code-block:: JAVA

    Update update = (Update)  CCJSqlParserUtil.parse(sqlStr);
    UpdateSet updateSet = update.getUpdateSets().get(0);
    ParenthesedSelect subSelect = (ParenthesedSelect) updateSet.getValues().get(0);
    Values values = (Values) subSelect.getSelect();
    assertEquals( 3, values.getExpressions().size() );

.. tab:: Clause

.. code-block:: SQL

    INSERT INTO test
    VALUES ( 1, 2, 3 )
    ;

.. code-block:: TEXT

    SQL Text
     └─Statements: statement.insert.Insert
        ├─Table: test
        └─select: statement.select.Values
           └─ParenthesedExpressionList: (1, 2, 3)


.. code-block:: JAVA

    Insert insert = (Insert)  CCJSqlParserUtil.parse(sqlStr);
    Values values = (Values) insert.getSelect();
    Assertions.assertEquals(3, values.getExpressions().size());

Expression Lists

The class ExpressionList extends List<Expression> directly and so ExpressionList.getExpressions() is obsolete.

Any instance of List<Expression> is considered an Anti Pattern and the class ExpressionList<T extends Expression> shall be used instead.

ItemsList has been removed and ExpressionList is used instead.

MultiExpressionList has been removed and ExpressionList is used instead (with ExpressionList elements).

.. tab:: ExpressionList

.. code-block:: SQL

    SELECT Function( a, b, c )
    FROM dual
    GROUP BY    a
                , b
                , c
    ;


.. code-block:: TEXT

    SQL Text
     └─Statements: statement.select.PlainSelect
        ├─selectItems: statement.select.SelectItem
        │  └─expression: expression.Function
        │     └─ExpressionList: a, b, c
        ├─Table: dual
        └─groupBy: statement.select.GroupByElement
           └─ExpressionList: a, b, c


.. code-block:: JAVA

    PlainSelect select = (PlainSelect)  CCJSqlParserUtil.parse(sqlStr);
    Function function = (Function) select.getSelectItem(0).getExpression();
    assertEquals(3, function.getParameters().size());

    ExpressionList<?> groupByExpressions=select.getGroupBy().getGroupByExpressionList();
    assertEquals(3, groupByExpressions.size());

.. tab:: Wrapped ExpressionList

.. code-block:: SQL

    SELECT ( ( 1, 2, 3 ), ( 4, 5, 6 ), ( 7, 8, 9 ) )
    ;


.. code-block:: TEXT

    SQL Text
     └─Statements: statement.select.PlainSelect
        └─selectItems: statement.select.SelectItem
           └─ParenthesedExpressionList: ((1, 2, 3), (4, 5, 6), (7, 8, 9))


.. code-block:: JAVA

    PlainSelect select = (PlainSelect)  CCJSqlParserUtil.parse(sqlStr);
    ParenthesedExpressionList<?> expressionList = (ParenthesedExpressionList<?>) select.getSelectItem(0).getExpression();

    ParenthesedExpressionList<?> expressionList1 = (ParenthesedExpressionList<?>) expressionList.get(0);
    assertEquals(3, expressionList1.size());

Generic SelectItem

The class SelectItem<T extends Expression> is now generic and various derivatives (e. |_| g. SelectExpressionItem, FunctionItem, ExpressionListItem) have been removed.

Select Statement

SelectBody has been removed and PlainSelect can be used directly

SubJoin has been replaced by ParenthesedFromItem (implementing a FromItem with a regular list of Join)

SubSelect has been removed and any instance of Select (PlainSelect, Values or SetOperationList) can be used instead

.. tab:: Select

.. code-block:: SQL

    (
        SELECT *
        FROM (  SELECT 1 )
        UNION ALL
        SELECT *
        FROM ( VALUES 1, 2, 3 )
        UNION ALL
        VALUES ( 1, 2, 3 ) )
    ;

.. code-block:: TEXT

    SQL Text
     └─Statements: statement.select.ParenthesedSelect
        └─select: statement.select.SetOperationList
           ├─selects: statement.select.PlainSelect
           │  ├─selectItems: statement.select.SelectItem
           │  │  └─AllColumns: *
           │  └─fromItem: statement.select.ParenthesedSelect
           │     └─select: statement.select.PlainSelect
           │        └─selectItems: statement.select.SelectItem
           │           └─LongValue: 1
           ├─selects: statement.select.PlainSelect
           │  ├─selectItems: statement.select.SelectItem
           │  │  └─AllColumns: *
           │  └─fromItem: statement.select.ParenthesedSelect
           │     └─select: statement.select.Values
           │        └─ExpressionList: 1, 2, 3
           ├─selects: statement.select.Values
           │  └─ParenthesedExpressionList: (1, 2, 3)
           ├─UnionOp: UNION ALL
           └─UnionOp: UNION ALL


.. code-block:: JAVA

    ParenthesedSelect parenthesedSelect = (ParenthesedSelect)  CCJSqlParserUtil.parse(sqlStr);
    SetOperationList setOperationList = parenthesedSelect.getSetOperationList();

    PlainSelect select1 = (PlainSelect) setOperationList.getSelect(0);
    PlainSelect subSelect1 = ((ParenthesedSelect) select1.getFromItem()).getPlainSelect();
    Assertions.assertEquals( 1L, subSelect1.getSelectItem(0).getExpression(LongValue.class).getValue());

    Values values = (Values) setOperationList.getSelect(2);
    Assertions.assertEquals( 3, values.getExpressions().size());

.. tab:: Join

.. code-block:: SQL

    SELECT *
    FROM a
      INNER JOIN (  b
                      LEFT JOIN c
                        ON b.d = c.d )
        ON a.e = b.e
    ;

.. code-block:: TEXT

    SQL Text
     └─Statements: statement.select.PlainSelect
        ├─selectItems: statement.select.SelectItem
        │  └─AllColumns: *
        ├─Table: a
        └─joins: statement.select.Join
           ├─rightItem: statement.select.ParenthesedFromItem
           │  ├─Table: b
           │  └─joins: statement.select.Join
           │     ├─Table: c
           │     └─onExpressions: expression.operators.relational.EqualsTo
           │        ├─Column: b.d
           │        └─Column: c.d
           └─onExpressions: expression.operators.relational.EqualsTo
              ├─Column: a.e
              └─Column: b.e


.. code-block:: JAVA

    PlainSelect select = (PlainSelect)  CCJSqlParserUtil.parse(sqlStr);
    Table aTable = (Table) select.getFromItem();

    ParenthesedFromItem fromItem = (ParenthesedFromItem) select.getJoin(0).getFromItem();
    Table bTable = (Table) fromItem.getFromItem();

    Join join = fromItem.getJoin(0);
    Table cTable = (Table) join.getFromItem();

    assertEquals("c", cTable.getName());

Brackets

Any hasBrackets(), isUsingBrackets() and similar methods have been removed; instead the Parser will return a ParenthesedExpressionList or ParenthesedSelect or ParenthesedFromItem or Parenthesis wrapping the object within brackets.

This allows for much better bracket handling.

.. code-block:: SQL :caption: Parenthesis and Brackets example

    ( SELECT ( 1 ) )
    ;

.. code-block:: TEXT

    SQL Text
     └─Statements: statement.select.ParenthesedSelect
        └─select: statement.select.PlainSelect
           └─selectItems: statement.select.SelectItem
              └─expression: expression.Parenthesis
                 └─LongValue: 1

.. code-block:: JAVA

    ParenthesedSelect parenthesedSelect = (ParenthesedSelect)  CCJSqlParserUtil.parse(sqlStr);
    SetOperationList setOperationList = parenthesedSelect.getSetOperationList();

    PlainSelect select1 = (PlainSelect) setOperationList.getSelect(0);
    PlainSelect subSelect1 = ((ParenthesedSelect) select1.getFromItem()).getPlainSelect();
    Assertions.assertEquals( 1L, subSelect1.getSelectItem(0).getExpression(LongValue.class).getValue());

    Values values = (Values) setOperationList.getSelect(2);
    Assertions.assertEquals( 3, values.getExpressions().size());

UpdateSet clause

A List<UpdateSet> is used for any Set clause within Insert, Update, Upsert or Merge statements.

.. code-block:: SQL :caption: UpdateSet example

    UPDATE a
    SET (   a
            , b
            , c ) = (   1
                        , 2
                        , 3 )
        , d = 4
    ;

.. code-block:: TEXT

    SQL Text
     └─Statements: statement.update.Update
        ├─Table: a
        ├─updateSets: statement.update.UpdateSet
        │  ├─ParenthesedExpressionList: (a, b, c)
        │  └─ParenthesedExpressionList: (1, 2, 3)
        └─updateSets: statement.update.UpdateSet
           ├─ExpressionList: d
           └─ExpressionList: 4

.. code-block:: JAVA

    Update update = (Update)  CCJSqlParserUtil.parse(sqlStr);
    UpdateSet updateSet1 = update.getUpdateSet(0);
    Assertions.assertEquals( 3, updateSet1.getColumns().size());
    Assertions.assertEquals( 3, updateSet1.getValues().size());

    UpdateSet updateSet2 = update.getUpdateSet(1);
    Assertions.assertEquals( "d", updateSet2.getColumn(0).getColumnName());
    Assertions.assertEquals( 4L,  ((LongValue) updateSet2.getValue(0)).getValue() );

Statements collection

The Statements class extends List<Statement> directly and so Statements.getStatements() is obsolete.