1212import java .io .Serializable ;
1313import java .util .function .Consumer ;
1414import net .sf .jsqlparser .expression .Expression ;
15+ import net .sf .jsqlparser .schema .Column ;
1516import net .sf .jsqlparser .expression .operators .relational .ExpressionList ;
1617
1718/** A PostgreSQL declarative-partition bound. */
@@ -123,9 +124,9 @@ public void appendTo(StringBuilder sql, Consumer<Expression> expressionPrinter)
123124 switch (type ) {
124125 case RANGE :
125126 sql .append ("FOR VALUES FROM (" );
126- expressionPrinter . accept ( fromExpressions );
127+ appendRangeValues ( sql , fromExpressions , expressionPrinter );
127128 sql .append (") TO (" );
128- expressionPrinter . accept ( toExpressions );
129+ appendRangeValues ( sql , toExpressions , expressionPrinter );
129130 sql .append (')' );
130131 break ;
131132 case LIST :
@@ -147,4 +148,68 @@ public void appendTo(StringBuilder sql, Consumer<Expression> expressionPrinter)
147148 break ;
148149 }
149150 }
151+
152+ /** Visits active bound expressions, excluding the MINVALUE/MAXVALUE range markers. */
153+ public void visitExpressions (Consumer <Expression > expressions ) {
154+ if (type == null ) {
155+ return ;
156+ }
157+ switch (type ) {
158+ case RANGE :
159+ visitRangeValues (fromExpressions , expressions );
160+ visitRangeValues (toExpressions , expressions );
161+ break ;
162+ case LIST :
163+ if (inExpressions != null ) {
164+ expressions .accept (inExpressions );
165+ }
166+ break ;
167+ case HASH :
168+ if (modulus != null ) {
169+ expressions .accept (modulus );
170+ }
171+ if (remainder != null ) {
172+ expressions .accept (remainder );
173+ }
174+ break ;
175+ default :
176+ break ;
177+ }
178+ }
179+
180+ private static void visitRangeValues (ExpressionList <Expression > values ,
181+ Consumer <Expression > expressions ) {
182+ if (values != null ) {
183+ values .stream ().filter (value -> !isRangeMarker (value )).forEach (expressions );
184+ }
185+ }
186+
187+ private static void appendRangeValues (StringBuilder sql , ExpressionList <Expression > values ,
188+ Consumer <Expression > expressions ) {
189+ if (values == null ) {
190+ sql .append ("null" );
191+ return ;
192+ }
193+ for (int i = 0 ; i < values .size (); i ++) {
194+ if (i > 0 ) {
195+ sql .append (", " );
196+ }
197+ Expression value = values .get (i );
198+ if (isRangeMarker (value )) {
199+ sql .append (value );
200+ } else {
201+ expressions .accept (value );
202+ }
203+ }
204+ }
205+
206+ private static boolean isRangeMarker (Expression expression ) {
207+ if (!(expression instanceof Column )) {
208+ return false ;
209+ }
210+ Column column = (Column ) expression ;
211+ return column .getTable () == null && ("MINVALUE" .equalsIgnoreCase (column .getColumnName ())
212+ || "MAXVALUE" .equalsIgnoreCase (column .getColumnName ()));
213+ }
214+
150215}
0 commit comments