Modify ↓
Opened 9 years ago
Last modified 8 years ago
#13054 new defect
Issue with 'RecentTopics' macro on PostgreSQL DB
| Reported by: | ntmlod | Owned by: | |
|---|---|---|---|
| Priority: | normal | Component: | DiscussionPlugin |
| Severity: | normal | Keywords: | |
| Cc: | Trac Release: | 1.0 |
Description
Not as an expert in the different SQL implementations but the syntax of get_recent_topics seems not to be compliant with psql
Log error
2017-01-17 15:24:26,276 Trac[formatter] ERROR: Macro RecentTopics(2) failed:
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/trac/wiki/formatter.py", line 765, in _macro_formatter
return macro.ensure_inline(macro.process(args))
File "/usr/lib/python2.7/site-packages/trac/wiki/formatter.py", line 356, in process
text = self.processor(text)
File "/usr/lib/python2.7/site-packages/trac/wiki/formatter.py", line 343, in _macro_processor
text)
File "build/bdist.linux-x86_64/egg/tracdiscussion/wiki.py", line 102, in expand_macro
return self._recent_topics(formatter, content)
File "build/bdist.linux-x86_64/egg/tracdiscussion/wiki.py", line 169, in _recent_topics
entries = self.api.get_recent_topics(context, forum_id, limit)
File "build/bdist.linux-x86_64/egg/tracdiscussion/model.py", line 253, in get_recent_topics
for row in self.env.db_query(sql, values)]
File "/usr/lib/python2.7/site-packages/trac/db/api.py", line 122, in execute
return db.execute(query, params)
File "/usr/lib/python2.7/site-packages/trac/db/util.py", line 121, in execute
cursor.execute(query, params)
File "/usr/lib/python2.7/site-packages/trac/db/util.py", line 65, in execute
return self.cursor.execute(sql_escape_percent(sql), args)
ProgrammingError: subquery in FROM must have an alias
LINE 1: SELECT forum, topic, MAX(time) as max_time FROM (SELECT fo...
^
HINT: For example, FROM (SELECT ...) [AS] foo.
My 2 cents fix
-
tracdiscussion/model.py
231 231 232 232 def get_recent_topics(self, context, forum_id, limit): 233 233 columns = ('forum', 'topic', 'time') 234 sql = ("SELECT forum, topic, MAX(time) as max_time"234 sql = ("SELECT forum, topic, max(time)" 235 235 " FROM" 236 236 " (SELECT forum, topic, time" 237 237 " FROM message" 238 238 " UNION" 239 239 " SELECT forum, id as topic, time" 240 " FROM topic)" + 241 (forum_id and " WHERE forum=%s" or '') + 242 " GROUP BY topic" 243 " ORDER BY max_time DESC" + 240 " FROM topic)" 241 " AS foo" + 242 (forum_id and " WHERE foo.forum=%s" or '') + 243 " GROUP BY foo.topic, foo.forum, foo.time" 244 " ORDER BY time DESC" + 244 245 (limit and " LIMIT %s" or '')) 245 246 values = [] 246 247 if forum_id:
Attachments (0)
Change History (3)
comment:1 Changed 9 years ago by
comment:2 Changed 8 years ago by
After a review, my initial patch was correct but did not give one result per topic
After several query tries, I defined this new fix
-
discussionplugin/1.0/tracdiscussion/model.py
231 231 232 232 def get_recent_topics(self, context, forum_id, limit): 233 233 columns = ('forum', 'topic', 'time') 234 sql = ("SELECT forum, topic, MAX(time) as max_time"234 sql = ("SELECT forum, topic, MAX(time) as time" 235 235 " FROM" 236 236 " (SELECT forum, topic, time" 237 237 " FROM message" 238 238 " UNION" 239 239 " SELECT forum, id as topic, time" 240 " FROM topic) " +240 " FROM topic) AS foo" + 241 241 (forum_id and " WHERE forum=%s" or '') + 242 " GROUP BY topic "243 " ORDER BY max_time DESC" +242 " GROUP BY topic, forum" 243 " ORDER BY time DESC" + 244 244 (limit and " LIMIT %s" or '')) 245 245 values = [] 246 246 if forum_id:
It seems that we can't rename MAX aggregator differently from 'time', must set an alias for the sub-query and add 'forum' argument in GROUP BY as a consequence.
comment:3 Changed 8 years ago by
| Summary: | Issue with 'RecentChanges' macro on PostgreSQL DB → Issue with 'RecentTopics' macro on PostgreSQL DB |
|---|
Note: See
TracTickets for help on using
tickets.



If you added a unit test we could evaluate the patch for the 3 database types.