Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitffbeafb

Browse files
committed
Constant expressions that appear in ORDER BY, GROUP BY, DISTINCT ON
lists should be reverse-compiled into targetlist index numbers, becausethat's the only interpretation the parser allows for a constant in theseclauses. (Ergo, the only way they could have gotten into the list inthe first place is to have come from the targetlist; so this should alwayswork.) Per problem report from Peter E.
1 parent7f2de49 commitffbeafb

File tree

1 file changed

+39
-19
lines changed

1 file changed

+39
-19
lines changed

‎src/backend/utils/adt/ruleutils.c

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*back to source text
44
*
55
* IDENTIFICATION
6-
* $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.75 2001/03/22 06:16:18momjian Exp $
6+
* $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.76 2001/04/15 03:14:18tgl Exp $
77
*
88
* This software is copyrighted by Jan Wieck - Hamburg.
99
*
@@ -120,6 +120,9 @@ static void get_basic_select_query(Query *query, deparse_context *context);
120120
staticvoidget_setop_query(Node*setOp,Query*query,
121121
deparse_context*context,booltoplevel);
122122
staticboolsimple_distinct(List*distinctClause,List*targetList);
123+
staticvoidget_rule_sortgroupclause(SortClause*srt,List*tlist,
124+
boolforce_colno,
125+
deparse_context*context);
123126
staticvoidget_names_for_var(Var*var,deparse_context*context,
124127
char**refname,char**attname);
125128
staticboolget_alias_for_case(CaseExpr*caseexpr,deparse_context*context,
@@ -925,7 +928,7 @@ static void
925928
get_select_query_def(Query*query,deparse_context*context)
926929
{
927930
StringInfobuf=context->buf;
928-
boolshortform_orderby;
931+
boolforce_colno;
929932
char*sep;
930933
List*l;
931934

@@ -938,12 +941,12 @@ get_select_query_def(Query *query, deparse_context *context)
938941
{
939942
get_setop_query(query->setOperations,query,context, true);
940943
/* ORDER BY clauses must be simple in this case */
941-
shortform_orderby= true;
944+
force_colno= true;
942945
}
943946
else
944947
{
945948
get_basic_select_query(query,context);
946-
shortform_orderby= false;
949+
force_colno= false;
947950
}
948951

949952
/* Add the ORDER BY clause if given */
@@ -954,16 +957,11 @@ get_select_query_def(Query *query, deparse_context *context)
954957
foreach(l,query->sortClause)
955958
{
956959
SortClause*srt= (SortClause*)lfirst(l);
957-
TargetEntry*sorttle;
958960
char*opname;
959961

960-
sorttle=get_sortgroupclause_tle(srt,
961-
query->targetList);
962962
appendStringInfo(buf,sep);
963-
if (shortform_orderby)
964-
appendStringInfo(buf,"%d",sorttle->resdom->resno);
965-
else
966-
get_rule_expr(sorttle->expr,context);
963+
get_rule_sortgroupclause(srt,query->targetList,
964+
force_colno,context);
967965
opname=get_opname(srt->sortop);
968966
if (strcmp(opname,"<")!=0)
969967
{
@@ -1017,12 +1015,10 @@ get_basic_select_query(Query *query, deparse_context *context)
10171015
foreach(l,query->distinctClause)
10181016
{
10191017
SortClause*srt= (SortClause*)lfirst(l);
1020-
Node*sortexpr;
10211018

1022-
sortexpr=get_sortgroupclause_expr(srt,
1023-
query->targetList);
10241019
appendStringInfo(buf,sep);
1025-
get_rule_expr(sortexpr,context);
1020+
get_rule_sortgroupclause(srt,query->targetList,
1021+
false,context);
10261022
sep=", ";
10271023
}
10281024
appendStringInfo(buf,")");
@@ -1082,12 +1078,10 @@ get_basic_select_query(Query *query, deparse_context *context)
10821078
foreach(l,query->groupClause)
10831079
{
10841080
GroupClause*grp= (GroupClause*)lfirst(l);
1085-
Node*groupexpr;
10861081

1087-
groupexpr=get_sortgroupclause_expr(grp,
1088-
query->targetList);
10891082
appendStringInfo(buf,sep);
1090-
get_rule_expr(groupexpr,context);
1083+
get_rule_sortgroupclause(grp,query->targetList,
1084+
false,context);
10911085
sep=", ";
10921086
}
10931087
}
@@ -1182,6 +1176,32 @@ simple_distinct(List *distinctClause, List *targetList)
11821176
return true;
11831177
}
11841178

1179+
/*
1180+
* Display a sort/group clause.
1181+
*/
1182+
staticvoid
1183+
get_rule_sortgroupclause(SortClause*srt,List*tlist,boolforce_colno,
1184+
deparse_context*context)
1185+
{
1186+
StringInfobuf=context->buf;
1187+
TargetEntry*tle;
1188+
Node*expr;
1189+
1190+
tle=get_sortgroupclause_tle(srt,tlist);
1191+
expr=tle->expr;
1192+
/*
1193+
* Use column-number form if requested by caller or if expression is a
1194+
* constant --- a constant is ambiguous (and will be misinterpreted
1195+
* by findTargetlistEntry()) if we dump it explicitly.
1196+
*/
1197+
if (force_colno|| (expr&&IsA(expr,Const)))
1198+
{
1199+
Assert(!tle->resdom->resjunk);
1200+
appendStringInfo(buf,"%d",tle->resdom->resno);
1201+
}
1202+
else
1203+
get_rule_expr(expr,context);
1204+
}
11851205

11861206
/* ----------
11871207
* get_insert_query_def- Parse back an INSERT parsetree

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp