Skip to content

Commit 0c4b263

Browse files
committed
Added UT for leastRestrictiveVarbinaryVarchar
Signed-off-by: Vinay Krishna Pudyodu <vinkrish.neo@gmail.com>
1 parent d3157be commit 0c4b263

1 file changed

Lines changed: 118 additions & 0 deletions

File tree

core/src/test/java/org/opensearch/sql/calcite/utils/OpenSearchTypeFactoryTest.java

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package org.opensearch.sql.calcite.utils;
77

88
import static org.junit.jupiter.api.Assertions.assertEquals;
9+
import static org.junit.jupiter.api.Assertions.assertFalse;
910
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
1011
import static org.junit.jupiter.api.Assertions.assertNotNull;
1112
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -128,6 +129,123 @@ public void testLeastRestrictiveDelegatesToSuperForPlainTypes() {
128129
assertEquals(SqlTypeName.INTEGER, result.getSqlTypeName());
129130
}
130131

132+
@Test
133+
public void testLeastRestrictiveVarbinaryAndVarcharReturnsVarbinary() {
134+
RelDataType varbinary = TYPE_FACTORY.createSqlType(SqlTypeName.VARBINARY);
135+
RelDataType varchar = TYPE_FACTORY.createSqlType(SqlTypeName.VARCHAR);
136+
137+
RelDataType result = TYPE_FACTORY.leastRestrictive(List.of(varbinary, varchar));
138+
139+
assertNotNull(result);
140+
assertEquals(SqlTypeName.VARBINARY, result.getSqlTypeName());
141+
assertFalse(result.isNullable());
142+
}
143+
144+
@Test
145+
public void testLeastRestrictiveVarcharAndVarbinaryReturnsVarbinary() {
146+
RelDataType varchar = TYPE_FACTORY.createSqlType(SqlTypeName.VARCHAR);
147+
RelDataType varbinary = TYPE_FACTORY.createSqlType(SqlTypeName.VARBINARY);
148+
149+
RelDataType result = TYPE_FACTORY.leastRestrictive(List.of(varchar, varbinary));
150+
151+
assertNotNull(result);
152+
assertEquals(SqlTypeName.VARBINARY, result.getSqlTypeName());
153+
}
154+
155+
@Test
156+
public void testLeastRestrictiveVarbinaryAndCharReturnsVarbinary() {
157+
RelDataType varbinary = TYPE_FACTORY.createSqlType(SqlTypeName.VARBINARY);
158+
RelDataType ch = TYPE_FACTORY.createSqlType(SqlTypeName.CHAR);
159+
160+
RelDataType result = TYPE_FACTORY.leastRestrictive(List.of(varbinary, ch));
161+
162+
assertNotNull(result);
163+
assertEquals(SqlTypeName.VARBINARY, result.getSqlTypeName());
164+
}
165+
166+
@Test
167+
public void testLeastRestrictiveVarbinaryAndMultipleVarcharLiteralsReturnsVarbinary() {
168+
RelDataType varbinary = TYPE_FACTORY.createSqlType(SqlTypeName.VARBINARY);
169+
RelDataType v1 = TYPE_FACTORY.createSqlType(SqlTypeName.VARCHAR);
170+
RelDataType v2 = TYPE_FACTORY.createSqlType(SqlTypeName.VARCHAR);
171+
172+
RelDataType result = TYPE_FACTORY.leastRestrictive(List.of(varbinary, v1, v2));
173+
174+
assertNotNull(result);
175+
assertEquals(SqlTypeName.VARBINARY, result.getSqlTypeName());
176+
}
177+
178+
@Test
179+
public void testLeastRestrictiveVarbinaryAndNullableVarcharReturnsNullableVarbinary() {
180+
RelDataType varbinary = TYPE_FACTORY.createSqlType(SqlTypeName.VARBINARY);
181+
RelDataType nullableVarchar =
182+
TYPE_FACTORY.createTypeWithNullability(
183+
TYPE_FACTORY.createSqlType(SqlTypeName.VARCHAR), true);
184+
185+
RelDataType result = TYPE_FACTORY.leastRestrictive(List.of(varbinary, nullableVarchar));
186+
187+
assertNotNull(result);
188+
assertEquals(SqlTypeName.VARBINARY, result.getSqlTypeName());
189+
assertTrue(result.isNullable());
190+
}
191+
192+
@Test
193+
public void testLeastRestrictiveNullableVarbinaryAndVarcharReturnsNullableVarbinary() {
194+
RelDataType nullableVarbinary =
195+
TYPE_FACTORY.createTypeWithNullability(
196+
TYPE_FACTORY.createSqlType(SqlTypeName.VARBINARY), true);
197+
RelDataType varchar = TYPE_FACTORY.createSqlType(SqlTypeName.VARCHAR);
198+
199+
RelDataType result = TYPE_FACTORY.leastRestrictive(List.of(nullableVarbinary, varchar));
200+
201+
assertNotNull(result);
202+
assertEquals(SqlTypeName.VARBINARY, result.getSqlTypeName());
203+
assertTrue(result.isNullable());
204+
}
205+
206+
@Test
207+
public void testLeastRestrictiveTwoVarbinariesReturnsVarbinary() {
208+
RelDataType v1 = TYPE_FACTORY.createSqlType(SqlTypeName.VARBINARY);
209+
RelDataType v2 = TYPE_FACTORY.createSqlType(SqlTypeName.VARBINARY);
210+
211+
RelDataType result = TYPE_FACTORY.leastRestrictive(List.of(v1, v2));
212+
213+
assertNotNull(result);
214+
assertEquals(SqlTypeName.VARBINARY, result.getSqlTypeName());
215+
}
216+
217+
@Test
218+
public void testLeastRestrictiveVarbinaryAndIntegerFallsBackToSuper() {
219+
RelDataType varbinary = TYPE_FACTORY.createSqlType(SqlTypeName.VARBINARY);
220+
RelDataType integer = TYPE_FACTORY.createSqlType(SqlTypeName.INTEGER);
221+
222+
// Mixing VARBINARY with a non-string type — varbinary/varchar coercion does not apply,
223+
// so this falls back to super.leastRestrictive (which returns null for incompatible types).
224+
RelDataType result = TYPE_FACTORY.leastRestrictive(List.of(varbinary, integer));
225+
226+
// super.leastRestrictive cannot find a common type for VARBINARY + INTEGER
227+
// The exact behavior depends on Calcite's type system, but the key check is that
228+
// we did NOT return VARBINARY from leastRestrictiveVarbinaryVarchar.
229+
if (result != null) {
230+
assertFalse(
231+
result.getSqlTypeName() == SqlTypeName.VARBINARY,
232+
"VARBINARY + INTEGER should not coerce to VARBINARY via the varbinary/varchar path");
233+
}
234+
}
235+
236+
@Test
237+
public void testLeastRestrictiveOnlyVarcharsReturnsVarchar() {
238+
RelDataType v1 = TYPE_FACTORY.createSqlType(SqlTypeName.VARCHAR);
239+
RelDataType v2 = TYPE_FACTORY.createSqlType(SqlTypeName.VARCHAR);
240+
241+
// No VARBINARY in list — leastRestrictiveVarbinaryVarchar returns null,
242+
// so super.leastRestrictive resolves to VARCHAR.
243+
RelDataType result = TYPE_FACTORY.leastRestrictive(List.of(v1, v2));
244+
245+
assertNotNull(result);
246+
assertEquals(SqlTypeName.VARCHAR, result.getSqlTypeName());
247+
}
248+
131249
@Test
132250
public void testConvertSqlTypeNameVarbinaryToBinaryExprType() {
133251
assertEquals(

0 commit comments

Comments
 (0)