1212import sqlancer .Randomly ;
1313import sqlancer .common .gen .ExpressionGenerator ;
1414import sqlancer .common .gen .NoRECGenerator ;
15+ import sqlancer .common .gen .TLPWhereGenerator ;
1516import sqlancer .common .schema .AbstractTables ;
1617import sqlancer .postgres .PostgresCompoundDataType ;
1718import sqlancer .postgres .PostgresGlobalState ;
6465import sqlancer .postgres .ast .PostgresSimilarTo ;
6566
6667public class PostgresExpressionGenerator implements ExpressionGenerator <PostgresExpression >,
67- NoRECGenerator <PostgresSelect , PostgresJoin , PostgresExpression , PostgresTable , PostgresColumn > {
68+ NoRECGenerator <PostgresSelect , PostgresJoin , PostgresExpression , PostgresTable , PostgresColumn >,
69+ TLPWhereGenerator <PostgresSelect , PostgresJoin , PostgresExpression , PostgresTable , PostgresColumn > {
6870
6971 private final int maxDepth ;
7072
@@ -108,7 +110,8 @@ public PostgresExpression generateExpression(int depth) {
108110 return generateExpression (depth , PostgresDataType .getRandomType ());
109111 }
110112
111- public List <PostgresExpression > generateOrderBy () {
113+ @ Override
114+ public List <PostgresExpression > generateOrderBys () {
112115 List <PostgresExpression > orderBys = new ArrayList <>();
113116 for (int i = 0 ; i < Randomly .smallNumber (); i ++) {
114117 orderBys .add (new PostgresOrderByTerm (PostgresColumnValue .create (Randomly .fromList (columns ), null ),
@@ -615,7 +618,7 @@ public static PostgresSubquery createSubquery(PostgresGlobalState globalState, S
615618 select .setWhereClause (gen .generateExpression (0 , PostgresDataType .BOOLEAN ));
616619 }
617620 if (Randomly .getBooleanWithRatherLowProbability ()) {
618- select .setOrderByClauses (gen .generateOrderBy ());
621+ select .setOrderByClauses (gen .generateOrderBys ());
619622 }
620623 if (Randomly .getBoolean ()) {
621624 select .setLimitClause (PostgresConstant .createIntConstant (Randomly .getPositiveOrZeroNonCachedInteger ()));
@@ -691,6 +694,21 @@ public List<PostgresExpression> getTableRefs() {
691694 .collect (Collectors .toList ());
692695 }
693696
697+ @ Override
698+ public List <PostgresExpression > generateFetchColumns (boolean shouldCreateDummy ) {
699+ if (shouldCreateDummy && Randomly .getBooleanWithRatherLowProbability ()) {
700+ return Arrays .asList (new PostgresColumnValue (PostgresColumn .createDummy ("*" ), null ));
701+ }
702+ allowAggregateFunctions = true ;
703+ List <PostgresExpression > fetchColumns = new ArrayList <>();
704+ List <PostgresColumn > targetColumns = Randomly .nonEmptySubset (columns );
705+ for (PostgresColumn c : targetColumns ) {
706+ fetchColumns .add (new PostgresColumnValue (c , null ));
707+ }
708+ allowAggregateFunctions = false ;
709+ return fetchColumns ;
710+ }
711+
694712 @ Override
695713 public String generateOptimizedQueryString (PostgresSelect select , PostgresExpression whereCondition ,
696714 boolean shouldUseAggregate ) {
@@ -703,7 +721,7 @@ public String generateOptimizedQueryString(PostgresSelect select, PostgresExpres
703721 }
704722 select .setWhereClause (whereCondition );
705723 if (Randomly .getBooleanWithSmallProbability ()) {
706- select .setOrderByClauses (generateOrderBy ());
724+ select .setOrderByClauses (generateOrderBys ());
707725 }
708726 select .setSelectType (SelectType .ALL );
709727 return select .asString ();
0 commit comments