@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));
  }
 @Test
 public void testEvaluateCastFromInvalidString() throws Exception {
   expectedException.expect(IllegalArgumentException.class);
   expectedException.expectMessage("Cannot convert \"POINTE ()\" to geo_shape");
   ToGeoFunction fn = getFunction(FUNCTION_NAME, DataTypes.STRING);
   fn.evaluate(Literal.newLiteral(DataTypes.STRING, INVALID_STR));
 }
  @Test
  public void testEvaluateCastFromInvalidObject() throws Exception {
    ToGeoFunction fn = getFunction(FUNCTION_NAME, DataTypes.OBJECT);

    expectedException.expect(IllegalArgumentException.class);
    expectedException.expectMessage(allOf(startsWith("Cannot convert"), endsWith("to geo_shape")));
    fn.evaluate(Literal.newLiteral(DataTypes.OBJECT, INVALID_OBJECT));
  }
 @Test
 public void testEvaluateCastFromString() throws Exception {
   ToGeoFunction fn = getFunction(FUNCTION_NAME, DataTypes.STRING);
   Object val = fn.evaluate(Literal.newLiteral(DataTypes.STRING, VALID_STR));
   assertThat(val, instanceOf(Map.class));
   assertThat(
       (Map<String, Object>) val,
       allOf(
           hasEntry("type", (Object) "Point"),
           hasEntry("coordinates", (Object) new double[] {0.0, 0.1})));
 }
  @Test
  public void testEvaluateCastFromObject() throws Exception {
    ToGeoFunction fn = getFunction(FUNCTION_NAME, DataTypes.OBJECT);

    Object val = fn.evaluate(Literal.newLiteral(DataTypes.OBJECT, VALID_OBJECT));
    assertThat(val, instanceOf(Map.class));
    Map<String, Object> valMap = (Map<String, Object>) val;
    assertThat(valMap.size(), is(2));
    assertThat(
        valMap,
        Matchers.allOf(
            Matchers.<String, Object>hasEntry("type", "Polygon"),
            Matchers.hasEntry("coordinates", VALID_OBJECT.get("coordinates"))));
  }