Commit graph

123 commits

Author SHA1 Message Date
Yugo Nagata
ae3761558f Replace the wrong file in the previous commit 2024-12-10 03:41:33 +09:00
Yugo Nagata
49068fb141 Add a missing file in the previous commit
I bumped the version number tentatively in 80a7648ad but the
update script is forgotten and this caused an install error.
2024-12-10 03:30:16 +09:00
Yugo Nagata
80a7648add Bump up to 1.10 2024-12-09 20:01:46 +09:00
Yugo Nagata
d292c70946
Prevent automatic index creation with set-returning function (#106)
Previously, a unique index is automatically created even when
a set-returning function is contained in FROM clause, but this
results in an error due to key duplication. Now, an index is
not created automatically when a relation other than table,
sub-query, or join is contained in FROM clause.

Issue (#99)
2024-12-09 19:53:32 +09:00
Yugo Nagata
48ddc99f44 Make some code cleaning in pg_ivm.c
Remove some while characters, and replace RangeVarGetRelidExtende
with RangeVarGetRelid, which are introduced by edde972624.
2024-10-21 13:12:50 +09:00
Ishant Bhaskar
edde972624
Fix a failure in DROP EXTENSION (#96)
When pg_ivm is dropped, the error "could not open relation with OID ..." occurred
at the hook function that enables DROP TABLE on an IMMV to remove the entry in
pg_ivm_immv. It was because that the primary key was already dropped at the time
pg_ivm_immv's toast is been dropped. Also, DROP TABLE command issued concurrently
with DROP EXTENSION pg_Ivm also could cause the same error because pg_ivm_immv
could be already dropped.

This race condition is fixed by using always RangeVarGetRelidExtended to get OID of
pg_ivm_immv instead of using a cache of get_relname_relid results. This makes sure
that pg_ivm_immv exists when this is scanned.
2024-10-21 12:45:44 +09:00
reshke
36d4a4770e
Create .gitignore file for excluding any binary/executable files (#103)
The .gitignore file is copied from pg_bigm. 

This doesn't contain files generated on Windows development environments for now,
but they will be added when anyone using Windows claim it.
2024-10-21 10:39:02 +09:00
reshke
b7be2aa7ff
Drop unused params from ExecCreateImmv function (#102) 2024-10-14 21:45:52 +09:00
Yugo Nagata
85b11c359a
Add a note for create_immv in README.md
With PostgreSQL 17 or later, while `refresh_immv` is running, 
the `search_path` is temporarily changed to `pg_catalog, pg_temp`.
2024-08-06 04:11:25 +09:00
Yugo Nagata
bb3c999c05 Add a missing file
Issue #98
2024-08-06 02:24:43 +09:00
Yugo Nagata
12a0120d45 Prepare 1.9 2024-07-31 13:00:31 +09:00
Yugo Nagata
65a2d36b22
Add support for PostgreSQL 17 (#92)
Compilation errors and warning are fixed.

The design of create_immv is also chaned as similar to PG17, that is,
firstly a relation is created without data then it is populated
by using the refresh logic.

This commit contains the following changes:

 - Change functions to use a safe search_path during maintenance operations
   when used with PostgreSQL 17

  This prevents maintenance operations (automatic maintenance of IMMVs and
  refresh_immv) from performing unsafe access.  Functions used by IMMVs that
  need to reference non-default schemas must specify a search path during
  function creation.

 - refresh_immv can be executed by users with the MAINTAIN privilege
   when used with PostgreSQL 17

Issue #90
2024-07-31 12:37:43 +09:00
thoshiai
7dff2f5402
Add support for PostgreSQL 17 (#84)
This commit allows to use pg_ivm with the latest master branch code of
PostgreSQL. We may need additional fixes because PG17  is not released
yet, though.
2024-03-27 15:28:39 +09:00
reshke
76888cd975
Fix compile with PG17 (#76)
Support for PostgreSQL17
Rename OverrideSearchPath to SearchPathMatcher from PG17.
2024-03-25 09:25:27 +09:00
Yugo Nagata
9736c8c832 Prepare 1.8 2024-03-01 23:28:28 +09:00
thoshiai
fc2339e16c
Fix checking for expressions containing an EXISTS subquery (#71)
EXISTS subquery is currently allowed only directly under WHERE clause
or in AND expression that is directly under WHERE. However, the check
was insufficient previously so that views using expressions other than
AND containing an EXISTS subquery could be created without an error
and it caused incorrect maintenance results.

To fix this check, add a new boolean member allow_context into 
check_ivm_restriction_context. This member means whether EXISTS
subquery is allowed in the current node being examined in 
check_ivm_restriction_walker. This should be set to true just before
calling check_ivm_restriction_walker for nodes directly under WHERE
or operands of AND expression direct under WHERE, and is reset to
false on every call of the function.

In passing, move the check for OR and NOT expression from 
rewrite_exists_subquery_walker to check_ivm_restriction_context, 
with some code cleaning.

---------

Co-authored-by: Yugo Nagata <nagata@sraoss.co.jp>
2024-03-01 20:33:56 +09:00
Yugo Nagata
980c4be338 Fix typo in the previous commit 2024-03-01 19:56:05 +09:00
Yugo Nagata
d67995c0ab Fix an error raised when dropping pg_ivm extension
Previously, DROP EXTENSION pg_ivm failed due to the failure of
opening the index on pg_ivm_immv in PgIvmObjectAccessHook that is
called on dropping pg_ivm_immv, because when pg_ivm_immv is being
dropped, the index on it is already dropped.

This is fixed to return immediately from the hook function if the
dropped table is pg_ivm_immv.
2024-03-01 14:48:55 +09:00
Colin Zhao
8f5bb5300a Check if PgIvmImmvRelationId is invalid before open it (#78)
When pg_ivm is installed shared_preload_libraries without executing
CREATE EXTENSION command, the hook function is set while the catalog
table pg_ivm_immv is not created. In this case, the hook function
failed to open the catalog table and an error was raised.

Although this way of installing pg_ivm was not considered, it would
be nice to reduce any possible troubles on users. Therefore, to
prevent this error, check if PgIvmImmvRelationId is invalid before
open it. When this is invalid, pg_ivm_immv relation is not created
yet, so there are not any IMMVs, so we don't have to do anything
in this hook function.

Review and commit message by Yugo Nagata
2024-03-01 14:16:57 +09:00
Yugo Nagata
01f0ea0eb1 Fix for view using both DISTINCT and EXISTS
In previous commit, maintenance of views using EXISTS and containing
duplicated tuples was fixed, but it was insufficient because it
raised an error during maintenance of views using both DISTINCT
and EXISTS. The cause was that tuples were tried to be duplicated
even when DISTINCT was specified. In this commit, it is fixed not
to duplicate tuples when DISTINCT is used.
2024-02-29 17:55:55 +09:00
Yugo Nagata
8c3b4ba9d7 Consider tuple duplicity in maintenance of EXISTS views
When a tuple is inserted into a table in an EXISTS subquery,
the duplicity of row is computed by count(*), but it was not
considered and only one tuple was inserted with ignoring
the duplicity.

This is fixed by duplicating rows as much as the duplicity
by using generate_series at inserting.

(Issue #82)
2024-02-29 17:55:55 +09:00
Éric Redon
aab9db3605
Fix typo in README heading (#81) 2024-02-20 16:37:14 +09:00
Yugo Nagata
8f87d0914a Prepare 1.7 2023-09-13 11:13:40 +09:00
Yugo Nagata
71f9d268b0
Add support for PostgreSQL 16 (#69) (#70)
Build errors/warnings against PostgreSQL 16 are fixed.
Also, adapted to the change of codes, including:

- Get rid of the "new" and "old" entries in a view's rangetable.
(Although, removed codes were dead codes because pg_ivm doesn't
 have any rules in pg_rewrite.)

- Rework query relation permission checking

- Require empty Bitmapsets to be represented as NULL

- Fix some compiler warnings
2023-09-11 15:23:51 +09:00
Yugo Nagata
6f99049848 Prepare 1.6 2023-08-31 21:11:36 +09:00
Yugo Nagata
1b4fb57774
Prohibit types without default btree opclass in the target list (#67)
Currently, types that does not have an equality operator cannot
be used in the target list of the view definition, because all
of target list entries are used for comparison to identify rows
to be updated or deleted in the view. Previously, an error is
raised at the time such view is incrementally maintained, this
is fixed to check that at the view creation time.

This restriction may be relaxed in future after we can use an
index to identify rows in the view.

Issue #61
2023-08-31 21:06:23 +09:00
thoshiai
c355f4003b
Support exists_subquery (#53)
Add EXISTS clause support in IVM
   
Correlated subqueries using EXISTS in WHERE clause are supported.
   
An EXISTS subquery in WHERE clause is rewritten to LATERAL subquery
in FROM clause, and IVM' process can handle this like as a normal join. 
Also, hidden columns "ivm_exists_count_X__"  are added to check if 
EXISTS condition is satisfied.  This column stores the count of how many 
rows in the subquery are correlated to (joined to) each row of the main 
query. When a base table contained in EXISTS clause is modified, this 
count value in IMMV is updated, and a row whose count becomes zero 
is deleted.

restrictions :
- EXISTS subqueries are allowed only in WHERE clause.
- aggregate functions are not supported together with EXISTS.
- EXISTS subqueries in a subquery are not supported.
- EXISTS condition can use only with AND Expr
2023-08-31 11:51:36 +09:00
Valentino
1f729c842a
Update README.md (#55)
Correct spelling mistake
2023-03-20 17:44:21 +09:00
Yugo Nagata
a81c657223 Bump up version number to 1.5.1 2023-03-02 14:44:25 +09:00
Yugo Nagata
aaaa6cff66 Rebuild the query for recalculating min/max after search_path change
Cached plans for recalculating min/max values are built using
pg_ivm_get_viewdef() that returns the view definition query text.
Therefore, if the search_path is changed, the query text is analyzed
again by SPI, and tables or functions in a wrong schema could be
referenced in the plan.

To fix this, we check whether the search_path is still the same
as when we made the cached plan and, if it isn't, we rebuild the
query text.

CVE-2023-23554
2023-03-02 14:44:05 +09:00
Yugo Nagata
14bb84c599 Fix to use qualified function names during maintenance
Previously, functions names in pg_catalog schema that were used during
view maintenance were not qualified. This is problematic because
functions in other schema could be referenced unintentionally. Moreover,
that could result in privilege escalation that if a nefarious user who
can create a function, arbitrary functions could be executed under IMMV
owner's privilege.

CVE-2023-23554
2023-03-02 14:43:24 +09:00
Yugo Nagata
99a176ab97 Fix row level security checks during view maintenance
The view maintenance is performed under the view owner privilege.
If a modified table has a RLS policy, the policy must be applied
to relation for the pre-update-state table and the delta table
that contained inserted or deleted tuples. Previously, the security
quals were set to each ENR in a subquery that represents such
relation. However, the security check on the delta table was not
properly handled, and this caused that rows that must not be
accessed from the view owner could appear in the view contents
when the view was refreshed incrementally during a query containing
multiple types of commands, like a modifying CTE that contains
INSERT and UPDATE, or a MERGE command.

This patch fixes it by setting RLS policy to a subquery that
presents the pre-update-state table and the delta able instead of
to each RLS. Also, this change makes the code more simple and easy
to maintain.

CVE-2023-22847
2023-03-02 14:42:37 +09:00
Yugo Nagata
0587e78651
Update README.md 2023-01-30 19:04:54 +09:00
Yugo Nagata
f0e5467281 Prepare 1.5 2023-01-30 12:28:53 +09:00
Yugo Nagata
b928e32774
Add CTE support (#47)
Simple CTEs which does not contain aggregates or DISTINCT are 
now supported similarly to simple sub-queries.

Before a view is maintained, all CTEs are converted to corresponding
subqueries to enable to treat CTEs as same as subqueries. For this
end, codes of the static function inline_cte in the core
(optimizer/plan/subselect.c) was imported.

Prohibit Unreferenced CTE is prohibited.
When a table in a unreferenced CTE is TRUNCATEd, the contents
of the IMMV is not affected so it must not be truncated. For
confirming it at the maintenance time, we have to check if the
modified table used in a CTE is actually referenced. Although
it would possible, we just disallow to create such IMMVs for now
since such unreferenced CTE is useless unless it doesn't contain
modifying commands, that is already prohibited.
2023-01-30 11:28:27 +09:00
Yugo Nagata
7997f3e260 Remove a unnecessary function call
It was added by 3de95c09 for consistency with the patch version
proposed for PostgreSQL core, but the called function was not
one we intended. Fortunately, the behavior has not been affected.

Now, I decided to remove this funciton since I come to think it is
confusable.

Also, added some comments on an argument left for the similar
consistency.
2023-01-27 15:37:11 +09:00
Yugo Nagata
b4b5ea28fd
Add some qeury checks on subqueries (#49)
Some conditions on view definition that should be prohibited,
for example,

- SELECT ... FROM func(..., (SELECT ... FROM ...), ..) ...;
- SELECT expr(SELECT ... FROM ...) FROM ...;

were not checked. Also, some error messages and the order of
tests are improved.
2023-01-26 16:59:15 +09:00
Yugo Nagata
e00ff9dd32
Fix to allow generate_sereis in FROM clause (#50)
Previously, it caused an error due to an ambiguous reference
at the maintenance time because generate_series is used internally.
This is fixed by using an alias name for the internal genearet_series.
2023-01-26 16:58:20 +09:00
Yugo Nagata
0e581c16e7 Fix automatic index creation to support subqueries
Previously, when a subquery is used a unique index could not be created
even if all primary key attributes appear in the target list.
2023-01-14 18:52:58 +09:00
Yugo Nagata
138eb19254
Fix Makefile to install pg_ivm--1.3--1.4.sql (#45)
This should have be included in the previous commit but was
accidentally forgotten. Issue #43
2023-01-10 18:41:50 +09:00
0xflotus
65b2e4937e
Fix small typos in README.md (#44) 2023-01-10 18:20:27 +09:00
Yugo Nagata
992fc538c8 Bump up version number to 1.4 2022-12-16 23:34:06 +09:00
Yugo Nagata
5db54f4669
Use exclusive lock for view maintenance caused by UPDATE or DELETE (#42)
When using DELETE or UPDATE, we must use exclusive lock for now
because apply_old_delta(_with_count) could result in wrong results
with concurrent transactions. We would like to improve it in future,
but we prevent it by using the lock for now.
2022-12-16 23:31:00 +09:00
Yugo Nagata
26f0b03b58
Fix bugs of IVM that occur when column names are specified in aggregate views (#41)
The names of additional columns for aggregate views are derived from column
names specified in the first parameter of create_immv, but when the number
was less than the length of the actual target list, segmentation fault occurred.
Furthermore, when the number of specified columns is more than the target list,
it overrode additional column names and it caused a failure of incremental
maintenance of an aggregate view.

To fix then, check the length of the specified column name list not to access
invalid area, and also prevent from overriding additional column names.
2022-12-16 19:13:08 +09:00
Yugo Nagata
326720874e
Fix a bug of automatic index creation (#40)
It is intended that a unique index is created only if all primary
keys of tables in FROM clause appear in the target list. For this
purpose, pull_varnos_of_level was used to extract relations in the
FROM clause, but it is incorrect and actually we should use
get_relids_in_jointree.

Due to this bug, an index could be created even even where there
is a pkey attribute from just one of relations in FROM clause.
2022-12-16 12:42:35 +09:00
thoshiai
59081de628
Fix segmentation fault in incorrect view def (#39)
A segfault was occurred when non-SELECT query was specified in create_immv since the statement type was not checked.

issue #37
2022-12-15 19:03:49 +09:00
Yugo Nagata
e857213281 Allow to variable PG_CONFIG together with make command 2022-11-25 18:33:27 +09:00
thoshiai
24dc053659
Fix not to create IMMV including other IMMV(#30) (#31)
Previously, IMMV including IMMV in its definition can be created by
create_immv(), but it should not be supported by IMMV because we
cannot maintain it recursively for now. This patch prevents it by raising
an error for such view definition on create_immv().
2022-10-18 15:51:41 +09:00
Yugo Nagata
6eddcd2a63 Merge branch 'main' of https://github.com/sraoss/pg_ivm into main 2022-09-30 23:57:01 +09:00
Yugo Nagata
5e69211d7b Bump up version number to 1.3 2022-09-30 23:56:33 +09:00