@Test
 public void testUpdateSetExpression() throws Exception {
   UpdateAnalyzedStatement statement = analyze("update users set other_id=other_id+1");
   UpdateAnalyzedStatement.NestedAnalyzedStatement statement1 =
       statement.nestedStatements().get(0);
   assertThat(statement1.assignments().size(), is(1));
   Symbol value = statement1.assignments().entrySet().iterator().next().getValue();
   assertThat(value, isFunction("add"));
 }
 @Test
 public void testUpdateSetColumnToColumnValue() throws Exception {
   UpdateAnalyzedStatement statement = analyze("update users set name=name");
   UpdateAnalyzedStatement.NestedAnalyzedStatement statement1 =
       statement.nestedStatements().get(0);
   assertThat(statement1.assignments().size(), is(1));
   Symbol value = statement1.assignments().entrySet().iterator().next().getValue();
   assertThat(value, isReference("name"));
 }
  @Test
  public void testUpdateAssignmentConvertableType() throws Exception {
    UpdateAnalyzedStatement.NestedAnalyzedStatement statement =
        analyze("update users set other_id=9.9").nestedStatements().get(0);
    Reference ref = statement.assignments().keySet().iterator().next();
    assertThat(ref, not(instanceOf(DynamicReference.class)));
    assertEquals(DataTypes.LONG, ref.info().type());

    Symbol value = statement.assignments().entrySet().iterator().next().getValue();
    assertThat(value, isLiteral(9L));
  }
  @Test
  public void testUpdateTableAlias() throws Exception {
    UpdateAnalyzedStatement.NestedAnalyzedStatement expectedAnalysis =
        analyze("update users set awesome=true where awesome=false").nestedStatements().get(0);
    UpdateAnalyzedStatement.NestedAnalyzedStatement actualAnalysis =
        analyze("update users as u set awesome=true where awesome=false").nestedStatements().get(0);

    assertEquals(expectedAnalysis.assignments(), actualAnalysis.assignments());
    assertEquals(
        ((Function) expectedAnalysis.whereClause().query()).arguments().get(0),
        ((Function) actualAnalysis.whereClause().query()).arguments().get(0));
  }
  @Test
  public void testUpdateAssignmentNestedDynamicColumn() throws Exception {
    UpdateAnalyzedStatement.NestedAnalyzedStatement statement =
        analyze("update users set details['arms']=3").nestedStatements().get(0);
    assertThat(statement.assignments().size(), is(1));

    Reference ref = statement.assignments().keySet().iterator().next();
    assertThat(ref, instanceOf(DynamicReference.class));
    Assert.assertEquals(DataTypes.LONG, ref.info().type());
    assertThat(ref.info().ident().columnIdent().isColumn(), is(false));
    assertThat(ref.info().ident().columnIdent().fqn(), is("details.arms"));
  }
  @Test
  public void testUpdateAssignments() throws Exception {
    UpdateAnalyzedStatement statement = analyze("update users set name='Trillian'");
    UpdateAnalyzedStatement.NestedAnalyzedStatement statement1 =
        statement.nestedStatements().get(0);
    assertThat(statement1.assignments().size(), is(1));
    assertThat(
        ((DocTableRelation) statement.sourceRelation()).tableInfo().ident(),
        is(new TableIdent(Schemas.DEFAULT_SCHEMA_NAME, "users")));

    Reference ref = statement1.assignments().keySet().iterator().next();
    assertThat(ref.info().ident().tableIdent().name(), is("users"));
    assertThat(ref.info().ident().columnIdent().name(), is("name"));
    assertTrue(statement1.assignments().containsKey(ref));

    Symbol value = statement1.assignments().entrySet().iterator().next().getValue();
    assertThat(value, isLiteral("Trillian"));
  }
 @Test
 public void testUpdateMuchAssignments() throws Exception {
   UpdateAnalyzedStatement.NestedAnalyzedStatement statement =
       analyze(
               "update users set other_id=9.9, name='Trillian', details=?, stuff=true, foo='bar'",
               new Object[] {new HashMap<String, Object>()})
           .nestedStatements()
           .get(0);
   assertThat(statement.assignments().size(), is(5));
 }
  @Test
  public void testUpdateWithParameter() throws Exception {
    Map[] friends =
        new Map[] {
          new HashMap<String, Object>() {
            {
              put("name", "Slartibartfast");
            }
          },
          new HashMap<String, Object>() {
            {
              put("name", "Marvin");
            }
          }
        };
    UpdateAnalyzedStatement.NestedAnalyzedStatement analysis =
        analyze(
                "update users set name=?, other_id=?, friends=? where id=?",
                new Object[] {"Jeltz", 0, friends, "9"})
            .nestedStatements()
            .get(0);
    assertThat(analysis.assignments().size(), is(3));
    assertThat(
        analysis
            .assignments()
            .get(new Reference(USER_TABLE_INFO.getReferenceInfo(new ColumnIdent("name")))),
        isLiteral("Jeltz"));
    assertThat(
        analysis
            .assignments()
            .get(new Reference(USER_TABLE_INFO.getReferenceInfo(new ColumnIdent("friends")))),
        isLiteral(friends, new ArrayType(DataTypes.OBJECT)));
    assertThat(
        analysis
            .assignments()
            .get(new Reference(USER_TABLE_INFO.getReferenceInfo(new ColumnIdent("other_id")))),
        isLiteral(0L));

    assertThat(((Function) analysis.whereClause().query()).arguments().get(1), isLiteral(9L));
  }
  @Test
  public void testUpdateWithEmptyObjectArray() throws Exception {
    UpdateAnalyzedStatement.NestedAnalyzedStatement analysis =
        analyze("update users set friends=? where other_id=0", new Object[] {new Map[0], 0})
            .nestedStatements()
            .get(0);

    Literal friendsLiteral =
        (Literal)
            analysis
                .assignments()
                .get(new Reference(USER_TABLE_INFO.getReferenceInfo(new ColumnIdent("friends"))));
    assertThat(friendsLiteral.valueType().id(), is(ArrayType.ID));
    assertEquals(DataTypes.OBJECT, ((ArrayType) friendsLiteral.valueType()).innerType());
    assertThat(((Object[]) friendsLiteral.value()).length, is(0));
  }