If the extension is needed to support some other function, then we can't drop it. Here's an example
SQL>
SQL> create table t ( x int, y int);
Table created.
SQL>
SQL> insert into t (x,y) select rownum, rownum from dual connect by level <=100;
100 rows created.
SQL>
SQL> exec dbms_stats.gather_table_stats('','T');
PL/SQL procedure successfully completed.
SQL>
SQL> select * from user_stat_extensions
2 where table_name = 'T';
no rows selected
So we start with no extensions. Now we add one to handle the relationship between X and Y
SQL>
SQL>
SQL> select dbms_stats.create_extended_stats('','T','(x,y)') from dual;
DBMS_STATS.CREATE_EXTENDED_STATS('','T','(X,Y)')
----------------------------------------------------------------------------------------------------------------------------------
SYS_STUYPW88OE302TFVBNC6$MMQXE
1 row selected.
SQL>
SQL> exec dbms_stats.gather_table_stats('','T');
PL/SQL procedure successfully completed.
SQL>
SQL> select * from user_stat_extensions
2 where table_name = 'T'
3 @pr
==============================
TABLE_NAME : T
EXTENSION_NAME : SYS_STUYPW88OE302TFVBNC6$MMQXE
EXTENSION : ("X","Y")
CREATOR : USER
DROPPABLE : YES
PL/SQL procedure successfully completed.
Now that extension is droppable, because (for lack of a better term) it is "standalone" in that it does not underpin any other function, and as well saw a few lines up, the table works just fine without it.
But now lets do this...
SQL>
SQL> alter table t add z int generated always as (y+x);
Table altered.
SQL>
SQL> exec dbms_stats.gather_table_stats('','T');
PL/SQL procedure successfully completed.
SQL>
SQL> select * from user_stat_extensions
2 where table_name = 'T'
3 @pr
==============================
TABLE_NAME : T
EXTENSION_NAME : SYS_STUYPW88OE302TFVBNC6$MMQXE
EXTENSION : ("X","Y")
CREATOR : USER
DROPPABLE : YES
==============================
TABLE_NAME : T
EXTENSION_NAME : Z
EXTENSION : ("Y"+"X")
CREATOR : SYSTEM
DROPPABLE : NO
PL/SQL procedure successfully completed.
SQL>
SQL>
We added an extension to explicitly support statistics on the new virtual column we just added. We need that for virtual column functionality to work, and hence you're not allowed to drop it.
There's nothing new in this approach - it's like you can't drop an index used for a primary key. They are bound together.