|
15 | 15 | * |
16 | 16 | * |
17 | 17 | * IDENTIFICATION |
18 | | - * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.254 2008/09/28 19:51:40 tgl Exp $ |
| 18 | + * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.255 2008/09/28 20:42:12 tgl Exp $ |
19 | 19 | * |
20 | 20 | *------------------------------------------------------------------------- |
21 | 21 | */ |
@@ -5777,40 +5777,63 @@ btcostestimate(PG_FUNCTION_ARGS) |
5777 | 5777 | if (found_saop) |
5778 | 5778 | PG_RETURN_VOID(); |
5779 | 5779 |
|
| 5780 | + MemSet(&vardata, 0, sizeof(vardata)); |
| 5781 | + |
5780 | 5782 | if (index->indexkeys[0] != 0) |
5781 | 5783 | { |
5782 | 5784 | /* Simple variable --- look to stats for the underlying table */ |
5783 | | - relid = getrelid(index->rel->relid, root->parse->rtable); |
| 5785 | + RangeTblEntry *rte = planner_rt_fetch(index->rel->relid, root); |
| 5786 | + |
| 5787 | + Assert(rte->rtekind == RTE_RELATION); |
| 5788 | + relid = rte->relid; |
5784 | 5789 | Assert(relid != InvalidOid); |
5785 | 5790 | colnum = index->indexkeys[0]; |
| 5791 | + |
| 5792 | + if (get_relation_stats_hook && |
| 5793 | + (*get_relation_stats_hook) (root, rte, colnum, &vardata)) |
| 5794 | + { |
| 5795 | + /* |
| 5796 | + * The hook took control of acquiring a stats tuple. If it did |
| 5797 | + * supply a tuple, it'd better have supplied a freefunc. |
| 5798 | + */ |
| 5799 | + if (HeapTupleIsValid(vardata.statsTuple) && |
| 5800 | + !vardata.freefunc) |
| 5801 | + elog(ERROR, "no function provided to release variable stats with"); |
| 5802 | + } |
| 5803 | + else |
| 5804 | + { |
| 5805 | + vardata.statsTuple = SearchSysCache(STATRELATT, |
| 5806 | + ObjectIdGetDatum(relid), |
| 5807 | + Int16GetDatum(colnum), |
| 5808 | + 0, 0); |
| 5809 | + vardata.freefunc = ReleaseSysCache; |
| 5810 | + } |
5786 | 5811 | } |
5787 | 5812 | else |
5788 | 5813 | { |
5789 | 5814 | /* Expression --- maybe there are stats for the index itself */ |
5790 | 5815 | relid = index->indexoid; |
5791 | 5816 | colnum = 1; |
5792 | | - } |
5793 | | - |
5794 | | - MemSet(&vardata, 0, sizeof(vardata)); |
5795 | 5817 |
|
5796 | | - if (get_index_stats_hook && |
5797 | | - (*get_index_stats_hook) (root, relid, colnum, &vardata)) |
5798 | | - { |
5799 | | - /* |
5800 | | - * The hook took control of acquiring a stats tuple. If it did supply |
5801 | | - * a tuple, it'd better have supplied a freefunc. |
5802 | | - */ |
5803 | | - if (HeapTupleIsValid(vardata.statsTuple) && |
5804 | | - !vardata.freefunc) |
5805 | | - elog(ERROR, "no function provided to release variable stats with"); |
5806 | | - } |
5807 | | - else |
5808 | | - { |
5809 | | - vardata.statsTuple = SearchSysCache(STATRELATT, |
5810 | | - ObjectIdGetDatum(relid), |
5811 | | - Int16GetDatum(colnum), |
5812 | | - 0, 0); |
5813 | | - vardata.freefunc = ReleaseSysCache; |
| 5818 | + if (get_index_stats_hook && |
| 5819 | + (*get_index_stats_hook) (root, relid, colnum, &vardata)) |
| 5820 | + { |
| 5821 | + /* |
| 5822 | + * The hook took control of acquiring a stats tuple. If it did |
| 5823 | + * supply a tuple, it'd better have supplied a freefunc. |
| 5824 | + */ |
| 5825 | + if (HeapTupleIsValid(vardata.statsTuple) && |
| 5826 | + !vardata.freefunc) |
| 5827 | + elog(ERROR, "no function provided to release variable stats with"); |
| 5828 | + } |
| 5829 | + else |
| 5830 | + { |
| 5831 | + vardata.statsTuple = SearchSysCache(STATRELATT, |
| 5832 | + ObjectIdGetDatum(relid), |
| 5833 | + Int16GetDatum(colnum), |
| 5834 | + 0, 0); |
| 5835 | + vardata.freefunc = ReleaseSysCache; |
| 5836 | + } |
5814 | 5837 | } |
5815 | 5838 |
|
5816 | 5839 | if (HeapTupleIsValid(vardata.statsTuple)) |
|
0 commit comments