|
30 | 30 | #include "postgres.h" |
31 | 31 |
|
32 | 32 | #include "access/genam.h" |
33 | | -#include "access/htup_details.h" |
34 | 33 | #include "access/multixact.h" |
35 | 34 | #include "access/relation.h" |
36 | | -#include "access/sysattr.h" |
37 | 35 | #include "access/table.h" |
38 | 36 | #include "access/tableam.h" |
39 | | -#include "access/toast_compression.h" |
40 | | -#include "access/transam.h" |
41 | | -#include "access/xact.h" |
42 | | -#include "access/xlog.h" |
43 | | -#include "catalog/binary_upgrade.h" |
44 | 37 | #include "catalog/catalog.h" |
45 | | -#include "catalog/dependency.h" |
46 | 38 | #include "catalog/heap.h" |
47 | 39 | #include "catalog/index.h" |
48 | 40 | #include "catalog/objectaccess.h" |
|
61 | 53 | #include "catalog/pg_tablespace.h" |
62 | 54 | #include "catalog/pg_type.h" |
63 | 55 | #include "catalog/storage.h" |
64 | | -#include "catalog/storage_xlog.h" |
65 | 56 | #include "commands/tablecmds.h" |
66 | 57 | #include "commands/typecmds.h" |
67 | | -#include "executor/executor.h" |
68 | 58 | #include "miscadmin.h" |
69 | 59 | #include "nodes/nodeFuncs.h" |
70 | 60 | #include "optimizer/optimizer.h" |
|
76 | 66 | #include "partitioning/partdesc.h" |
77 | 67 | #include "storage/lmgr.h" |
78 | 68 | #include "storage/predicate.h" |
79 | | -#include "storage/smgr.h" |
80 | | -#include "utils/acl.h" |
81 | 69 | #include "utils/builtins.h" |
82 | | -#include "utils/datum.h" |
83 | 70 | #include "utils/fmgroids.h" |
84 | 71 | #include "utils/inval.h" |
85 | 72 | #include "utils/lsyscache.h" |
86 | | -#include "utils/partcache.h" |
87 | | -#include "utils/ruleutils.h" |
88 | | -#include "utils/snapmgr.h" |
89 | 73 | #include "utils/syscache.h" |
90 | 74 |
|
91 | 75 |
|
@@ -1757,131 +1741,6 @@ RemoveAttributeById(Oid relid, AttrNumber attnum) |
1757 | 1741 | relation_close(rel, NoLock); |
1758 | 1742 | } |
1759 | 1743 |
|
1760 | | -/* |
1761 | | - * RemoveAttrDefault |
1762 | | - * |
1763 | | - * If the specified relation/attribute has a default, remove it. |
1764 | | - * (If no default, raise error if complain is true, else return quietly.) |
1765 | | - */ |
1766 | | -void |
1767 | | -RemoveAttrDefault(Oid relid, AttrNumber attnum, |
1768 | | - DropBehavior behavior, bool complain, bool internal) |
1769 | | -{ |
1770 | | - Relation attrdef_rel; |
1771 | | - ScanKeyData scankeys[2]; |
1772 | | - SysScanDesc scan; |
1773 | | - HeapTuple tuple; |
1774 | | - bool found = false; |
1775 | | - |
1776 | | - attrdef_rel = table_open(AttrDefaultRelationId, RowExclusiveLock); |
1777 | | - |
1778 | | - ScanKeyInit(&scankeys[0], |
1779 | | - Anum_pg_attrdef_adrelid, |
1780 | | - BTEqualStrategyNumber, F_OIDEQ, |
1781 | | - ObjectIdGetDatum(relid)); |
1782 | | - ScanKeyInit(&scankeys[1], |
1783 | | - Anum_pg_attrdef_adnum, |
1784 | | - BTEqualStrategyNumber, F_INT2EQ, |
1785 | | - Int16GetDatum(attnum)); |
1786 | | - |
1787 | | - scan = systable_beginscan(attrdef_rel, AttrDefaultIndexId, true, |
1788 | | - NULL, 2, scankeys); |
1789 | | - |
1790 | | - /* There should be at most one matching tuple, but we loop anyway */ |
1791 | | - while (HeapTupleIsValid(tuple = systable_getnext(scan))) |
1792 | | - { |
1793 | | - ObjectAddress object; |
1794 | | - Form_pg_attrdef attrtuple = (Form_pg_attrdef) GETSTRUCT(tuple); |
1795 | | - |
1796 | | - object.classId = AttrDefaultRelationId; |
1797 | | - object.objectId = attrtuple->oid; |
1798 | | - object.objectSubId = 0; |
1799 | | - |
1800 | | - performDeletion(&object, behavior, |
1801 | | - internal ? PERFORM_DELETION_INTERNAL : 0); |
1802 | | - |
1803 | | - found = true; |
1804 | | - } |
1805 | | - |
1806 | | - systable_endscan(scan); |
1807 | | - table_close(attrdef_rel, RowExclusiveLock); |
1808 | | - |
1809 | | - if (complain && !found) |
1810 | | - elog(ERROR, "could not find attrdef tuple for relation %u attnum %d", |
1811 | | - relid, attnum); |
1812 | | -} |
1813 | | - |
1814 | | -/* |
1815 | | - * RemoveAttrDefaultById |
1816 | | - * |
1817 | | - * Remove a pg_attrdef entry specified by OID. This is the guts of |
1818 | | - * attribute-default removal. Note it should be called via performDeletion, |
1819 | | - * not directly. |
1820 | | - */ |
1821 | | -void |
1822 | | -RemoveAttrDefaultById(Oid attrdefId) |
1823 | | -{ |
1824 | | - Relation attrdef_rel; |
1825 | | - Relation attr_rel; |
1826 | | - Relation myrel; |
1827 | | - ScanKeyData scankeys[1]; |
1828 | | - SysScanDesc scan; |
1829 | | - HeapTuple tuple; |
1830 | | - Oid myrelid; |
1831 | | - AttrNumber myattnum; |
1832 | | - |
1833 | | - /* Grab an appropriate lock on the pg_attrdef relation */ |
1834 | | - attrdef_rel = table_open(AttrDefaultRelationId, RowExclusiveLock); |
1835 | | - |
1836 | | - /* Find the pg_attrdef tuple */ |
1837 | | - ScanKeyInit(&scankeys[0], |
1838 | | - Anum_pg_attrdef_oid, |
1839 | | - BTEqualStrategyNumber, F_OIDEQ, |
1840 | | - ObjectIdGetDatum(attrdefId)); |
1841 | | - |
1842 | | - scan = systable_beginscan(attrdef_rel, AttrDefaultOidIndexId, true, |
1843 | | - NULL, 1, scankeys); |
1844 | | - |
1845 | | - tuple = systable_getnext(scan); |
1846 | | - if (!HeapTupleIsValid(tuple)) |
1847 | | - elog(ERROR, "could not find tuple for attrdef %u", attrdefId); |
1848 | | - |
1849 | | - myrelid = ((Form_pg_attrdef) GETSTRUCT(tuple))->adrelid; |
1850 | | - myattnum = ((Form_pg_attrdef) GETSTRUCT(tuple))->adnum; |
1851 | | - |
1852 | | - /* Get an exclusive lock on the relation owning the attribute */ |
1853 | | - myrel = relation_open(myrelid, AccessExclusiveLock); |
1854 | | - |
1855 | | - /* Now we can delete the pg_attrdef row */ |
1856 | | - CatalogTupleDelete(attrdef_rel, &tuple->t_self); |
1857 | | - |
1858 | | - systable_endscan(scan); |
1859 | | - table_close(attrdef_rel, RowExclusiveLock); |
1860 | | - |
1861 | | - /* Fix the pg_attribute row */ |
1862 | | - attr_rel = table_open(AttributeRelationId, RowExclusiveLock); |
1863 | | - |
1864 | | - tuple = SearchSysCacheCopy2(ATTNUM, |
1865 | | - ObjectIdGetDatum(myrelid), |
1866 | | - Int16GetDatum(myattnum)); |
1867 | | - if (!HeapTupleIsValid(tuple)) /* shouldn't happen */ |
1868 | | - elog(ERROR, "cache lookup failed for attribute %d of relation %u", |
1869 | | - myattnum, myrelid); |
1870 | | - |
1871 | | - ((Form_pg_attribute) GETSTRUCT(tuple))->atthasdef = false; |
1872 | | - |
1873 | | - CatalogTupleUpdate(attr_rel, &tuple->t_self, tuple); |
1874 | | - |
1875 | | - /* |
1876 | | - * Our update of the pg_attribute row will force a relcache rebuild, so |
1877 | | - * there's nothing else to do here. |
1878 | | - */ |
1879 | | - table_close(attr_rel, RowExclusiveLock); |
1880 | | - |
1881 | | - /* Keep lock on attribute's rel until end of xact */ |
1882 | | - relation_close(myrel, NoLock); |
1883 | | -} |
1884 | | - |
1885 | 1744 | /* |
1886 | 1745 | * heap_drop_with_catalog - removes specified relation from catalogs |
1887 | 1746 | * |
@@ -2193,195 +2052,6 @@ SetAttrMissing(Oid relid, char *attname, char *value) |
2193 | 2052 | table_close(tablerel, AccessExclusiveLock); |
2194 | 2053 | } |
2195 | 2054 |
|
2196 | | -/* |
2197 | | - * Store a default expression for column attnum of relation rel. |
2198 | | - * |
2199 | | - * Returns the OID of the new pg_attrdef tuple. |
2200 | | - * |
2201 | | - * add_column_mode must be true if we are storing the default for a new |
2202 | | - * attribute, and false if it's for an already existing attribute. The reason |
2203 | | - * for this is that the missing value must never be updated after it is set, |
2204 | | - * which can only be when a column is added to the table. Otherwise we would |
2205 | | - * in effect be changing existing tuples. |
2206 | | - */ |
2207 | | -Oid |
2208 | | -StoreAttrDefault(Relation rel, AttrNumber attnum, |
2209 | | - Node *expr, bool is_internal, bool add_column_mode) |
2210 | | -{ |
2211 | | - char *adbin; |
2212 | | - Relation adrel; |
2213 | | - HeapTuple tuple; |
2214 | | - Datum values[4]; |
2215 | | - static bool nulls[4] = {false, false, false, false}; |
2216 | | - Relation attrrel; |
2217 | | - HeapTuple atttup; |
2218 | | - Form_pg_attribute attStruct; |
2219 | | - char attgenerated; |
2220 | | - Oid attrdefOid; |
2221 | | - ObjectAddress colobject, |
2222 | | - defobject; |
2223 | | - |
2224 | | - adrel = table_open(AttrDefaultRelationId, RowExclusiveLock); |
2225 | | - |
2226 | | - /* |
2227 | | - * Flatten expression to string form for storage. |
2228 | | - */ |
2229 | | - adbin = nodeToString(expr); |
2230 | | - |
2231 | | - /* |
2232 | | - * Make the pg_attrdef entry. |
2233 | | - */ |
2234 | | - attrdefOid = GetNewOidWithIndex(adrel, AttrDefaultOidIndexId, |
2235 | | - Anum_pg_attrdef_oid); |
2236 | | - values[Anum_pg_attrdef_oid - 1] = ObjectIdGetDatum(attrdefOid); |
2237 | | - values[Anum_pg_attrdef_adrelid - 1] = RelationGetRelid(rel); |
2238 | | - values[Anum_pg_attrdef_adnum - 1] = attnum; |
2239 | | - values[Anum_pg_attrdef_adbin - 1] = CStringGetTextDatum(adbin); |
2240 | | - |
2241 | | - tuple = heap_form_tuple(adrel->rd_att, values, nulls); |
2242 | | - CatalogTupleInsert(adrel, tuple); |
2243 | | - |
2244 | | - defobject.classId = AttrDefaultRelationId; |
2245 | | - defobject.objectId = attrdefOid; |
2246 | | - defobject.objectSubId = 0; |
2247 | | - |
2248 | | - table_close(adrel, RowExclusiveLock); |
2249 | | - |
2250 | | - /* now can free some of the stuff allocated above */ |
2251 | | - pfree(DatumGetPointer(values[Anum_pg_attrdef_adbin - 1])); |
2252 | | - heap_freetuple(tuple); |
2253 | | - pfree(adbin); |
2254 | | - |
2255 | | - /* |
2256 | | - * Update the pg_attribute entry for the column to show that a default |
2257 | | - * exists. |
2258 | | - */ |
2259 | | - attrrel = table_open(AttributeRelationId, RowExclusiveLock); |
2260 | | - atttup = SearchSysCacheCopy2(ATTNUM, |
2261 | | - ObjectIdGetDatum(RelationGetRelid(rel)), |
2262 | | - Int16GetDatum(attnum)); |
2263 | | - if (!HeapTupleIsValid(atttup)) |
2264 | | - elog(ERROR, "cache lookup failed for attribute %d of relation %u", |
2265 | | - attnum, RelationGetRelid(rel)); |
2266 | | - attStruct = (Form_pg_attribute) GETSTRUCT(atttup); |
2267 | | - attgenerated = attStruct->attgenerated; |
2268 | | - if (!attStruct->atthasdef) |
2269 | | - { |
2270 | | - Form_pg_attribute defAttStruct; |
2271 | | - |
2272 | | - ExprState *exprState; |
2273 | | - Expr *expr2 = (Expr *) expr; |
2274 | | - EState *estate = NULL; |
2275 | | - ExprContext *econtext; |
2276 | | - Datum valuesAtt[Natts_pg_attribute]; |
2277 | | - bool nullsAtt[Natts_pg_attribute]; |
2278 | | - bool replacesAtt[Natts_pg_attribute]; |
2279 | | - Datum missingval = (Datum) 0; |
2280 | | - bool missingIsNull = true; |
2281 | | - |
2282 | | - MemSet(valuesAtt, 0, sizeof(valuesAtt)); |
2283 | | - MemSet(nullsAtt, false, sizeof(nullsAtt)); |
2284 | | - MemSet(replacesAtt, false, sizeof(replacesAtt)); |
2285 | | - valuesAtt[Anum_pg_attribute_atthasdef - 1] = true; |
2286 | | - replacesAtt[Anum_pg_attribute_atthasdef - 1] = true; |
2287 | | - |
2288 | | - if (rel->rd_rel->relkind == RELKIND_RELATION && add_column_mode && |
2289 | | - !attgenerated) |
2290 | | - { |
2291 | | - expr2 = expression_planner(expr2); |
2292 | | - estate = CreateExecutorState(); |
2293 | | - exprState = ExecPrepareExpr(expr2, estate); |
2294 | | - econtext = GetPerTupleExprContext(estate); |
2295 | | - |
2296 | | - missingval = ExecEvalExpr(exprState, econtext, |
2297 | | - &missingIsNull); |
2298 | | - |
2299 | | - FreeExecutorState(estate); |
2300 | | - |
2301 | | - defAttStruct = TupleDescAttr(rel->rd_att, attnum - 1); |
2302 | | - |
2303 | | - if (missingIsNull) |
2304 | | - { |
2305 | | - /* if the default evaluates to NULL, just store a NULL array */ |
2306 | | - missingval = (Datum) 0; |
2307 | | - } |
2308 | | - else |
2309 | | - { |
2310 | | - /* otherwise make a one-element array of the value */ |
2311 | | - missingval = PointerGetDatum(construct_array(&missingval, |
2312 | | - 1, |
2313 | | - defAttStruct->atttypid, |
2314 | | - defAttStruct->attlen, |
2315 | | - defAttStruct->attbyval, |
2316 | | - defAttStruct->attalign)); |
2317 | | - } |
2318 | | - |
2319 | | - valuesAtt[Anum_pg_attribute_atthasmissing - 1] = !missingIsNull; |
2320 | | - replacesAtt[Anum_pg_attribute_atthasmissing - 1] = true; |
2321 | | - valuesAtt[Anum_pg_attribute_attmissingval - 1] = missingval; |
2322 | | - replacesAtt[Anum_pg_attribute_attmissingval - 1] = true; |
2323 | | - nullsAtt[Anum_pg_attribute_attmissingval - 1] = missingIsNull; |
2324 | | - } |
2325 | | - atttup = heap_modify_tuple(atttup, RelationGetDescr(attrrel), |
2326 | | - valuesAtt, nullsAtt, replacesAtt); |
2327 | | - |
2328 | | - CatalogTupleUpdate(attrrel, &atttup->t_self, atttup); |
2329 | | - |
2330 | | - if (!missingIsNull) |
2331 | | - pfree(DatumGetPointer(missingval)); |
2332 | | - |
2333 | | - } |
2334 | | - table_close(attrrel, RowExclusiveLock); |
2335 | | - heap_freetuple(atttup); |
2336 | | - |
2337 | | - /* |
2338 | | - * Make a dependency so that the pg_attrdef entry goes away if the column |
2339 | | - * (or whole table) is deleted. |
2340 | | - */ |
2341 | | - colobject.classId = RelationRelationId; |
2342 | | - colobject.objectId = RelationGetRelid(rel); |
2343 | | - colobject.objectSubId = attnum; |
2344 | | - |
2345 | | - recordDependencyOn(&defobject, &colobject, DEPENDENCY_AUTO); |
2346 | | - |
2347 | | - /* |
2348 | | - * Record dependencies on objects used in the expression, too. |
2349 | | - */ |
2350 | | - if (attgenerated) |
2351 | | - { |
2352 | | - /* |
2353 | | - * Generated column: Dropping anything that the generation expression |
2354 | | - * refers to automatically drops the generated column. |
2355 | | - */ |
2356 | | - recordDependencyOnSingleRelExpr(&colobject, expr, RelationGetRelid(rel), |
2357 | | - DEPENDENCY_AUTO, |
2358 | | - DEPENDENCY_AUTO, false); |
2359 | | - } |
2360 | | - else |
2361 | | - { |
2362 | | - /* |
2363 | | - * Normal default: Dropping anything that the default refers to |
2364 | | - * requires CASCADE and drops the default only. |
2365 | | - */ |
2366 | | - recordDependencyOnSingleRelExpr(&defobject, expr, RelationGetRelid(rel), |
2367 | | - DEPENDENCY_NORMAL, |
2368 | | - DEPENDENCY_NORMAL, false); |
2369 | | - } |
2370 | | - |
2371 | | - /* |
2372 | | - * Post creation hook for attribute defaults. |
2373 | | - * |
2374 | | - * XXX. ALTER TABLE ALTER COLUMN SET/DROP DEFAULT is implemented with a |
2375 | | - * couple of deletion/creation of the attribute's default entry, so the |
2376 | | - * callee should check existence of an older version of this entry if it |
2377 | | - * needs to distinguish. |
2378 | | - */ |
2379 | | - InvokeObjectPostCreateHookArg(AttrDefaultRelationId, |
2380 | | - RelationGetRelid(rel), attnum, is_internal); |
2381 | | - |
2382 | | - return attrdefOid; |
2383 | | -} |
2384 | | - |
2385 | 2055 | /* |
2386 | 2056 | * Store a check-constraint expression for the given relation. |
2387 | 2057 | * |
|
0 commit comments