I rewrite test with end-to-end usage (hope it`s correct) and put it into
blank.iq (test is near) and found that it not follow the sql standard.
Also probably someone can suggest how can i write test with dynamic params
involved ? I found that Quidem has no appropriate functionality.
Thanks !
create table fix_char_col (i int, c char(5));
(0 rows modified)
!update
insert into fix_char_col values (1, 'aaaaa'), (2, 'aaaaaa'), (3, '
aaaaaa'), (4, 'aa'), (5, ' aa');
(1 row modified)
!update
SELECT * FROM fix_char_col ORDER BY i;
+---+---+
| I | C |
+---+---+
| 1 | aaaaa |
| 2 | aaaaa |
| 3 | aaaa |
| 4 | aa |
| 5 | aa |
+---+-------+
(2 rows)
!ok
and as a result :
expected:
< +---+---+
< | I | C |
< +---+---+
< | 1 | aaaaa |
< | 2 | aaaaa |
< | 3 | aaaa |
< | 4 | aa |
< | 5 | aa |
< +---+-------+
calcite output:
+---+---------+
| I | C |
+---+---------+
| 1 | aaaaa |
| 2 | aaaaaa |
| 3 | aaaaaa |
| 4 | aa |
| 5 | aa |
+---+---------+
Ok, thanks i understand what you are talking about, i will move the test
and fill issue if it necessary.
I agree that that query should throw when executed. If it doesn’t, you
should log a bug.
However, that test in SqlToRelConverterTest doesn’t prove that Calcite
doesn’t throw at execute time.
On Feb 8, 2023, at 11:20 PM, stanilovsky evgeny
<estanilovs...@gridgain.com> wrote:
Hello, seems sql standard regulate situation when insertion (char,
varchar) data exceeds fixed len column as :
If the declared type T is fixed length string with length in
characters L and the
length in characters M of V is larger than L, then
Case:
a) If the right part M–L characters of V are all space`s, then the
value of T is set to the first
L characters of V.
b) If one or more of the right part M–L characters of V are not
space`s, then exception is raised.
But fast test [1] in SqlToRelConverterTest highlights that calcite not
satisfy of such a rule.
I miss something or need to fill the issue ?
Thanks !
[1]
@Test void testInsert1() {
String moreThanVarcharLimit = "a".repeat(30);
final String sql = "insert into emp (empno, ename, job, mgr,
hiredate,\n"
+ " sal, comm, deptno, slacker)\n"
+ "values(1, '" + moreThanVarcharLimit + "', 'job', 0,\n"
+ " timestamp '1970-01-01 00:00:00', 1, 1, 1, false)";
sql(sql).ok();
}