Skip to content

Commit 7acf9d5

Browse files
fix: Issue #2109 true and false value parsed as column instead of BooleanValue (#2110)
Co-authored-by: Luca Rota <lrota@eutelsat.com>
1 parent bc0c5d2 commit 7acf9d5

File tree

11 files changed

+191
-3
lines changed

11 files changed

+191
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2024 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.expression;
11+
12+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
13+
14+
import java.util.Objects;
15+
16+
/**
17+
* A boolean value true/false
18+
*/
19+
public final class BooleanValue extends ASTNodeAccessImpl implements Expression {
20+
21+
private boolean value = false;
22+
23+
public BooleanValue() {
24+
// empty constructor
25+
}
26+
27+
public BooleanValue(String value) {
28+
this(Boolean.parseBoolean(value));
29+
}
30+
31+
public BooleanValue(boolean bool) {
32+
value = bool;
33+
}
34+
35+
public boolean getValue() {
36+
return value;
37+
}
38+
39+
public void setValue(boolean bool) {
40+
value = bool;
41+
}
42+
43+
@Override
44+
public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
45+
return expressionVisitor.visit(this, context);
46+
}
47+
48+
@Override
49+
public String toString() {
50+
return Boolean.toString(value);
51+
}
52+
53+
public BooleanValue withValue(boolean bool) {
54+
this.setValue(bool);
55+
return this;
56+
}
57+
58+
@Override
59+
public boolean equals(Object o) {
60+
if (this == o) {
61+
return true;
62+
}
63+
if (o == null || getClass() != o.getClass()) {
64+
return false;
65+
}
66+
BooleanValue that = (BooleanValue) o;
67+
return Objects.equals(value, that.value);
68+
}
69+
70+
@Override
71+
public int hashCode() {
72+
return Objects.hash(value);
73+
}
74+
}

src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java

+6
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,12 @@ default void visit(StringValue stringValue) {
147147
this.visit(stringValue, null);
148148
}
149149

150+
<S> T visit(BooleanValue booleanValue, S context);
151+
152+
default void visit(BooleanValue booleanValue) {
153+
this.visit(booleanValue, null);
154+
}
155+
150156
<S> T visit(Addition addition, S context);
151157

152158
default void visit(Addition addition) {

src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java

+5
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,11 @@ public <S> T visit(StringValue stringValue, S context) {
156156
return visitExpression(stringValue, context);
157157
}
158158

159+
@Override
160+
public <S> T visit(BooleanValue booleanValue, S context) {
161+
return visitExpression(booleanValue, context);
162+
}
163+
159164
@Override
160165
public <S> T visit(Addition addition, S context) {
161166
return visitBinaryExpression(addition, context);

src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java

+2
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public class ParserKeywordsUtils {
6868
{"EXCEPT", RESTRICTED_SQL2016},
6969
{"EXCLUDES", RESTRICTED_JSQLPARSER},
7070
{"EXISTS", RESTRICTED_SQL2016},
71+
{"FALSE", RESTRICTED_SQL2016},
7172
{"FETCH", RESTRICTED_SQL2016},
7273
{"FINAL", RESTRICTED_JSQLPARSER},
7374
{"FOR", RESTRICTED_SQL2016},
@@ -131,6 +132,7 @@ public class ParserKeywordsUtils {
131132
{"TABLES", RESTRICTED_ALIAS},
132133
{"TOP", RESTRICTED_SQL2016},
133134
{"TRAILING", RESTRICTED_SQL2016},
135+
{"TRUE", RESTRICTED_SQL2016},
134136
{"UNBOUNDED", RESTRICTED_JSQLPARSER},
135137
{"UNION", RESTRICTED_SQL2016},
136138
{"UNIQUE", RESTRICTED_SQL2016},

src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java

+7
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import net.sf.jsqlparser.expression.ArrayConstructor;
1717
import net.sf.jsqlparser.expression.ArrayExpression;
1818
import net.sf.jsqlparser.expression.BinaryExpression;
19+
import net.sf.jsqlparser.expression.BooleanValue;
1920
import net.sf.jsqlparser.expression.CaseExpression;
2021
import net.sf.jsqlparser.expression.CastExpression;
2122
import net.sf.jsqlparser.expression.CollateExpression;
@@ -626,6 +627,12 @@ public <S> Void visit(StringValue stringValue, S context) {
626627
return null;
627628
}
628629

630+
@Override
631+
public <S> Void visit(BooleanValue booleanValue, S context) {
632+
633+
return null;
634+
}
635+
629636
@Override
630637
public <S> Void visit(Subtraction subtraction, S context) {
631638
visitBinaryExpression(subtraction);

src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java

+12
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import net.sf.jsqlparser.expression.ArrayConstructor;
1717
import net.sf.jsqlparser.expression.ArrayExpression;
1818
import net.sf.jsqlparser.expression.BinaryExpression;
19+
import net.sf.jsqlparser.expression.BooleanValue;
1920
import net.sf.jsqlparser.expression.CaseExpression;
2021
import net.sf.jsqlparser.expression.CastExpression;
2122
import net.sf.jsqlparser.expression.CollateExpression;
@@ -621,6 +622,13 @@ public <S> StringBuilder visit(StringValue stringValue, S context) {
621622
return buffer;
622623
}
623624

625+
@Override
626+
public <S> StringBuilder visit(BooleanValue booleanValue, S context) {
627+
buffer.append(booleanValue.getValue());
628+
629+
return buffer;
630+
}
631+
624632
@Override
625633
public <S> StringBuilder visit(Subtraction subtraction, S context) {
626634
deparse(subtraction, " - ", null);
@@ -749,6 +757,10 @@ public void visit(StringValue stringValue) {
749757
visit(stringValue, null);
750758
}
751759

760+
public void visit(BooleanValue booleanValue) {
761+
visit(booleanValue, null);
762+
}
763+
752764
public void visit(Subtraction subtraction) {
753765
visit(subtraction, null);
754766
}

src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java

+11
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import net.sf.jsqlparser.expression.ArrayConstructor;
1616
import net.sf.jsqlparser.expression.ArrayExpression;
1717
import net.sf.jsqlparser.expression.BinaryExpression;
18+
import net.sf.jsqlparser.expression.BooleanValue;
1819
import net.sf.jsqlparser.expression.CaseExpression;
1920
import net.sf.jsqlparser.expression.CastExpression;
2021
import net.sf.jsqlparser.expression.CollateExpression;
@@ -486,6 +487,12 @@ public <S> Void visit(StringValue stringValue, S context) {
486487
return null;
487488
}
488489

490+
@Override
491+
public <S> Void visit(BooleanValue booleanValue, S context) {
492+
// nothing to validate
493+
return null;
494+
}
495+
489496
@Override
490497
public <S> Void visit(Subtraction subtraction, S context) {
491498
visitBinaryExpression(subtraction, " - ");
@@ -620,6 +627,10 @@ public void visit(StringValue stringValue) {
620627
visit(stringValue, null);
621628
}
622629

630+
public void visit(BooleanValue booleanValue) {
631+
visit(booleanValue, null);
632+
}
633+
623634
public void visit(Subtraction subtraction) {
624635
visit(subtraction, null);
625636
}

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

+5-3
Original file line numberDiff line numberDiff line change
@@ -2022,7 +2022,7 @@ String RelObjectNameWithoutValue() :
20222022
{ Token tk = null; }
20232023
{
20242024
( tk=<DATA_TYPE> | tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> | tk=<K_DATE_LITERAL> | tk=<K_DATETIMELITERAL> | tk=<K_STRING_FUNCTION_NAME> | tk=<K_ISOLATION> | tk=<K_TIME_KEY_EXPR> | tk=<K_TEXT_LITERAL>
2025-
| tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="ALGORITHM" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="APPROXIMATE" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="BASE64" | tk="BEGIN" | tk="BERNOULLI" | tk="BINARY" | tk="BIT" | tk="BLOCK" | tk="BROWSE" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMIT" | tk="CONCURRENTLY" | tk="CONFLICT" | tk="CONSTRAINTS" | tk="CONVERT" | tk="COSTS" | tk="COUNT" | tk="CS" | tk="CYCLE" | tk="DATA" | tk="DATABASE" | tk="DATETIME" | tk="DBA_RECYCLEBIN" | tk="DDL" | tk="DECLARE" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DOMAIN" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="ELEMENTS" | tk="EMIT" | tk="ENABLE" | tk="END" | tk="ENGINE" | tk="ERROR" | tk="ESCAPE" | tk="EXCLUDE" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXPLICIT" | tk="EXTENDED" | tk="EXTRACT" | tk="FALSE" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GRANT" | tk="GROUP_CONCAT" | tk="GUARD" | tk="HASH" | tk="HIGH_PRIORITY" | tk="HISTORY" | tk="HOPPING" | tk="INCLUDE" | tk="INCLUDE_NULL_VALUES" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="INTERPRET" | tk="INVALIDATE" | tk="ISNULL" | tk="JSON" | tk="JSON_ARRAY" | tk="JSON_ARRAYAGG" | tk="JSON_OBJECT" | tk="JSON_OBJECTAGG" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="LAST" | tk="LEADING" | tk="LESS" | tk="LINK" | tk="LOCAL" | tk="LOCK" | tk="LOCKED" | tk="LOG" | tk="LONGTEXT" | tk="LOOP" | tk="LOW_PRIORITY" | tk="MATCH" | tk="MATCHED" | tk="MATERIALIZED" | tk="MAX" | tk="MAXVALUE" | tk="MEDIUMTEXT" | tk="MEMBER" | tk="MERGE" | tk="MIN" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NOORDER" | tk="NOTHING" | tk="NOTNULL" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="OVER" | tk="OVERFLOW" | tk="OVERLAPS" | tk="PARALLEL" | tk="PARENT" | tk="PARTITION" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PLAN" | tk="PRECEDING" | tk="PRIMARY" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="RAW" | tk="READ" | tk="RECURSIVE" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGEXP" | tk="REGEXP_LIKE" | tk="REGISTER" | tk="REMOTE" | tk="RENAME" | tk="REPEATABLE" | tk="REPLACE" | tk="RESET" | tk="RESPECT" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RETURN" | tk="RLIKE" | tk="ROLLBACK" | tk="ROLLUP" | tk="ROOT" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="SAFE_CAST" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SECURE" | tk="SEED" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHARE" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="STORED" | tk="STRING" | tk="STRUCT" | tk="SUMMARIZE" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="TEXT" | tk="THAN" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TIMEZONE" | tk="TINYTEXT" | tk="TO" | tk="TRIGGER" | tk="TRUE" | tk="TRUNCATE" | tk="TRY_CAST" | tk="TUMBLING" | tk="TYPE" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VERBOSE" | tk="VIEW" | tk="VOLATILE" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WITHOUT_ARRAY_WRAPPER" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLDATA" | tk="XMLSCHEMA" | tk="XMLTEXT" | tk="XSINIL" | tk="YAML" | tk="YES" | tk="ZONE" )
2025+
| tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="ALGORITHM" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="APPROXIMATE" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="BASE64" | tk="BEGIN" | tk="BERNOULLI" | tk="BINARY" | tk="BIT" | tk="BLOCK" | tk="BROWSE" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMIT" | tk="CONCURRENTLY" | tk="CONFLICT" | tk="CONSTRAINTS" | tk="CONVERT" | tk="COSTS" | tk="COUNT" | tk="CS" | tk="CYCLE" | tk="DATA" | tk="DATABASE" | tk="DATETIME" | tk="DBA_RECYCLEBIN" | tk="DDL" | tk="DECLARE" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DOMAIN" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="ELEMENTS" | tk="EMIT" | tk="ENABLE" | tk="END" | tk="ENGINE" | tk="ERROR" | tk="ESCAPE" | tk="EXCLUDE" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXPLICIT" | tk="EXTENDED" | tk="EXTRACT" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GRANT" | tk="GROUP_CONCAT" | tk="GUARD" | tk="HASH" | tk="HIGH_PRIORITY" | tk="HISTORY" | tk="HOPPING" | tk="INCLUDE" | tk="INCLUDE_NULL_VALUES" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="INTERPRET" | tk="INVALIDATE" | tk="ISNULL" | tk="JSON" | tk="JSON_ARRAY" | tk="JSON_ARRAYAGG" | tk="JSON_OBJECT" | tk="JSON_OBJECTAGG" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="LAST" | tk="LEADING" | tk="LESS" | tk="LINK" | tk="LOCAL" | tk="LOCK" | tk="LOCKED" | tk="LOG" | tk="LONGTEXT" | tk="LOOP" | tk="LOW_PRIORITY" | tk="MATCH" | tk="MATCHED" | tk="MATERIALIZED" | tk="MAX" | tk="MAXVALUE" | tk="MEDIUMTEXT" | tk="MEMBER" | tk="MERGE" | tk="MIN" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NOORDER" | tk="NOTHING" | tk="NOTNULL" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="OVER" | tk="OVERFLOW" | tk="OVERLAPS" | tk="PARALLEL" | tk="PARENT" | tk="PARTITION" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PLAN" | tk="PRECEDING" | tk="PRIMARY" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="RAW" | tk="READ" | tk="RECURSIVE" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGEXP" | tk="REGEXP_LIKE" | tk="REGISTER" | tk="REMOTE" | tk="RENAME" | tk="REPEATABLE" | tk="REPLACE" | tk="RESET" | tk="RESPECT" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RETURN" | tk="RLIKE" | tk="ROLLBACK" | tk="ROLLUP" | tk="ROOT" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="SAFE_CAST" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SECURE" | tk="SEED" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHARE" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="STORED" | tk="STRING" | tk="STRUCT" | tk="SUMMARIZE" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="TEXT" | tk="THAN" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TIMEZONE" | tk="TINYTEXT" | tk="TO" | tk="TRIGGER" | tk="TRUNCATE" | tk="TRY_CAST" | tk="TUMBLING" | tk="TYPE" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VERBOSE" | tk="VIEW" | tk="VOLATILE" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WITHOUT_ARRAY_WRAPPER" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLDATA" | tk="XMLSCHEMA" | tk="XMLTEXT" | tk="XSINIL" | tk="YAML" | tk="YES" | tk="ZONE" )
20262026
{ return tk.image; }
20272027
}
20282028

@@ -4786,7 +4786,7 @@ Expression PrimaryExpression() #PrimaryExpression:
47864786

47874787
| LOOKAHEAD(2, {!interrupted}) retval=DateTimeLiteralExpression()
47884788

4789-
| LOOKAHEAD( 3 , {!interrupted}) retval=StructType()
4789+
| LOOKAHEAD(3 , {!interrupted}) retval=StructType()
47904790

47914791
| LOOKAHEAD(3, {!interrupted}) <K_ARRAY_LITERAL> retval=ArrayConstructor(true)
47924792

@@ -4800,6 +4800,8 @@ Expression PrimaryExpression() #PrimaryExpression:
48004800

48014801
| LOOKAHEAD(2, {!interrupted}) retval=Column()
48024802

4803+
| LOOKAHEAD(2, {!interrupted}) (token=<K_TRUE> | token=<K_FALSE>) { retval = new BooleanValue(token.image); }
4804+
48034805
| token=<S_CHAR_LITERAL> { retval = new StringValue(token.image); linkAST(retval,jjtThis); }
48044806

48054807
| "{d" token=<S_CHAR_LITERAL> "}" { retval = new DateValue(token.image); }
@@ -6750,7 +6752,7 @@ String AList():
67506752
"("
67516753

67526754
(
6753-
( (tk=<S_LONG> | tk=<S_DOUBLE> | tk=<S_CHAR_LITERAL>) { retval.append(tk.image); }
6755+
( (tk=<S_LONG> | tk=<S_DOUBLE> | tk=<S_CHAR_LITERAL> | tk=<K_TRUE> | tk=<K_FALSE>) { retval.append(tk.image); }
67546756
| (name=RelObjectNameWithoutValue()) { retval.append(name); })
67556757
[("," {retval.append(",");} | "=" {retval.append("=");})] )*
67566758

src/site/sphinx/keywords.rst

+4
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and
5353
+----------------------+-------------+-----------+
5454
| EXISTS | Yes | Yes |
5555
+----------------------+-------------+-----------+
56+
| FALSE | Yes | Yes |
57+
+----------------------+-------------+-----------+
5658
| FETCH | Yes | Yes |
5759
+----------------------+-------------+-----------+
5860
| FINAL | Yes | Yes |
@@ -179,6 +181,8 @@ The following Keywords are **restricted** in JSQLParser-|JSQLPARSER_VERSION| and
179181
+----------------------+-------------+-----------+
180182
| TRAILING | Yes | Yes |
181183
+----------------------+-------------+-----------+
184+
| TRUE | Yes | Yes |
185+
+----------------------+-------------+-----------+
182186
| UNBOUNDED | Yes | Yes |
183187
+----------------------+-------------+-----------+
184188
| UNION | Yes | Yes |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2024 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.expression;
11+
12+
import org.junit.jupiter.api.Test;
13+
14+
import static org.junit.jupiter.api.Assertions.*;
15+
16+
/**
17+
*
18+
* @author tw
19+
*/
20+
public class BooleanValueTest {
21+
22+
@Test
23+
public void testTrueValue() {
24+
BooleanValue value = new BooleanValue("true");
25+
26+
assertTrue(value.getValue());
27+
}
28+
29+
@Test
30+
public void testFalseValue() {
31+
BooleanValue value = new BooleanValue("false");
32+
33+
assertFalse(value.getValue());
34+
}
35+
36+
@Test
37+
public void testWrongValueAsFalseLargeNumber() {
38+
BooleanValue value = new BooleanValue("test");
39+
40+
assertFalse(value.getValue());
41+
}
42+
43+
@Test
44+
public void testNullStringValue() {
45+
BooleanValue value = new BooleanValue(null);
46+
47+
assertFalse(value.getValue());
48+
}
49+
}

src/test/java/net/sf/jsqlparser/statement/update/UpdateTest.java

+16
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
package net.sf.jsqlparser.statement.update;
1111

1212
import net.sf.jsqlparser.JSQLParserException;
13+
import net.sf.jsqlparser.expression.BooleanValue;
1314
import net.sf.jsqlparser.expression.DoubleValue;
1415
import net.sf.jsqlparser.expression.JdbcParameter;
1516
import net.sf.jsqlparser.expression.LongValue;
@@ -36,6 +37,7 @@
3637
import static net.sf.jsqlparser.test.TestUtils.assertUpdateMysqlHintExists;
3738
import static org.junit.jupiter.api.Assertions.assertEquals;
3839
import static org.junit.jupiter.api.Assertions.assertFalse;
40+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
3941
import static org.junit.jupiter.api.Assertions.assertThrows;
4042
import static org.junit.jupiter.api.Assertions.assertTrue;
4143

@@ -550,4 +552,18 @@ public void testPreferringClause(String sqlStr) throws JSQLParserException {
550552
assertSqlCanBeParsedAndDeparsed(sqlStr);
551553
}
552554

555+
@Test
556+
public void testUpdateWithBoolean() throws JSQLParserException {
557+
String statement = "UPDATE mytable set col1='as', col2=true Where o >= 3";
558+
Update update = (Update) PARSER_MANAGER.parse(new StringReader(statement));
559+
assertEquals("mytable", update.getTable().toString());
560+
assertEquals(2, update.getUpdateSets().size());
561+
assertEquals("col1", update.getUpdateSets().get(0).getColumns().get(0).getColumnName());
562+
assertEquals("col2", update.getUpdateSets().get(1).getColumns().get(0).getColumnName());
563+
assertEquals("as",
564+
((StringValue) update.getUpdateSets().get(0).getValues().get(0)).getValue());
565+
assertInstanceOf(BooleanValue.class, update.getUpdateSets().get(1).getValues().get(0));
566+
assertTrue(((BooleanValue) update.getUpdateSets().get(1).getValues().get(0)).getValue());
567+
assertInstanceOf(GreaterThanEquals.class, update.getWhere());
568+
}
553569
}

0 commit comments

Comments
 (0)