diff --git a/pgadmin/dlg/dlgView.cpp b/pgadmin/dlg/dlgView.cpp index ca594b5..54765e3 100644 --- a/pgadmin/dlg/dlgView.cpp +++ b/pgadmin/dlg/dlgView.cpp @@ -79,18 +79,21 @@ #define txtFillFactor CTRL_TEXT("txtFillFactor") #define stMatViewWithData CTRL_STATIC("stMatViewWithData") #define chkMatViewWithData CTRL_CHECKBOX("chkMatViewWithData") +#define stCheckOption CTRL_STATIC("stCheckOption") +#define cbCheckOption CTRL_COMBOBOX("cbCheckOption") BEGIN_EVENT_TABLE(dlgView, dlgSecurityProperty) EVT_STC_MODIFIED(XRCID("txtSqlBox"), dlgProperty::OnChangeStc) EVT_CHECKBOX(XRCID("chkSecurityBarrier"), dlgProperty::OnChange) + EVT_COMBOBOX(XRCID("cbCheckOption"), dlgProperty::OnChange) /* Materialized view setting */ - EVT_CHECKBOX(XRCID("chkMaterializedView"), dlgView::OnCheckMaterializedView) - EVT_TEXT(XRCID("txtFillFactor"), dlgView::OnChangeVacuum) + EVT_CHECKBOX(XRCID("chkMaterializedView"), dlgView::OnCheckMaterializedView) + EVT_TEXT(XRCID("txtFillFactor"), dlgView::OnChangeVacuum) - EVT_COMBOBOX(XRCID("cboTablespace"), dlgView::OnChangeVacuum) + EVT_COMBOBOX(XRCID("cboTablespace"), dlgView::OnChangeVacuum) - EVT_CHECKBOX(XRCID("chkMatViewWithData"), dlgProperty::OnChange) + EVT_CHECKBOX(XRCID("chkMatViewWithData"), dlgProperty::OnChange) /* AutoVacuum Settings */ EVT_CHECKBOX(XRCID("chkCustomVac"), dlgView::OnChangeVacuum) @@ -153,6 +156,7 @@ int dlgView::Go(bool modal) seclabelPage->Disable(); chkSecurityBarrier->Enable(connection->BackendMinimumVersion(9, 2)); + cbCheckOption->Enable(connection->BackendMinimumVersion(9, 4)); if (connection->BackendMinimumVersion(9, 3)) { @@ -350,6 +354,13 @@ int dlgView::Go(bool modal) // It is not materialized view so disabling all the controls DisableMaterializedView(); } + + if (view->GetCheckOption().Cmp(wxT("cascaded")) == 0) + cbCheckOption->SetSelection(2); + else if (view->GetCheckOption().Cmp(wxT("local")) == 0) + cbCheckOption->SetSelection(1); + else + cbCheckOption->SetSelection(0); } } else @@ -357,6 +368,7 @@ int dlgView::Go(bool modal) // create mode cboTablespace->Insert(_(""), 0, (void *)0); cboTablespace->SetSelection(0); + cbCheckOption->SetSelection(0); wxCommandEvent ev; OnChangeVacuum(ev); } @@ -428,6 +440,11 @@ void dlgView::CheckChange() enable = enable || (chkSecurityBarrier->GetValue()); } } + + if (connection->BackendMinimumVersion(9, 4) && view) + { + enable = enable || cbCheckOption->GetValue().Lower().Cmp(view->GetCheckOption()) != 0; + } } EnableOK(enable); @@ -438,6 +455,7 @@ wxString dlgView::GetSql() { wxString sql; wxString name; + wxString withoptions = wxEmptyString; bool editQuery = false; if (view) @@ -502,7 +520,16 @@ wxString dlgView::GetSql() sql += wxT("CREATE MATERIALIZED VIEW ") + name; if (connection->BackendMinimumVersion(9, 2) && chkSecurityBarrier->GetValue()) - sql += wxT(" WITH (security_barrier=true)"); + withoptions += wxT("security_barrier=true"); + if (connection->BackendMinimumVersion(9, 4)) + { + if (withoptions.Length() > 0) + withoptions += wxT(", "); + withoptions += wxT("check_option=") + cbCheckOption->GetValue().Lower(); + } + + if (withoptions.Length() > 0) + sql += wxT(" WITH (") + withoptions + wxT(")"); // Add the parameter of tablespace and storage parameter to create the materilized view if (connection->BackendMinimumVersion(9, 3) && chkMaterializedView->GetValue()) @@ -711,6 +738,19 @@ wxString dlgView::GetSql() sql += wxT("ALTER VIEW ") + name + wxT("\n SET (security_barrier=false);\n"); } + if (connection->BackendMinimumVersion(9, 4) + && cbCheckOption->GetValue().Lower().Cmp(view->GetCheckOption()) != 0) + { + if (cbCheckOption->GetValue().Cmp(wxT("No")) == 0) + sql += wxT("ALTER VIEW ") + name + wxT(" RESET (check_option);\n"); + else + sql += wxT("ALTER VIEW ") + name + wxT("\n SET (check_option=") + cbCheckOption->GetValue().Lower() + wxT(");\n"); + } + + if (withoptions.Length() > 0) + sql += wxT(" WITH (") + withoptions + wxT(")"); + + if (connection->BackendMinimumVersion(9, 3) && chkMaterializedView->GetValue()) { if (txtFillFactor->GetValue() != view->GetFillFactor()) diff --git a/pgadmin/include/schema/pgView.h b/pgadmin/include/schema/pgView.h index dac8d67..7ab908a 100644 --- a/pgadmin/include/schema/pgView.h +++ b/pgadmin/include/schema/pgView.h @@ -148,6 +148,15 @@ public: isPopulated = s; } + wxString GetCheckOption() + { + return check_option; + } + void iSetCheckOption(const wxString &s) + { + check_option = s; + } + bool GetCustomAutoVacuumEnabled() { return !reloptions.IsEmpty(); @@ -358,7 +367,7 @@ private: toast_autovacuum_vacuum_cost_limit, toast_autovacuum_freeze_min_age, toast_autovacuum_freeze_max_age, toast_autovacuum_freeze_table_age; - wxString tablespace, isPopulated; + wxString tablespace, isPopulated, check_option; bool hasToastTable; OID tablespaceOid; diff --git a/pgadmin/schema/pgView.cpp b/pgadmin/schema/pgView.cpp index 5a3e0c5..a7e1b14 100644 --- a/pgadmin/schema/pgView.cpp +++ b/pgadmin/schema/pgView.cpp @@ -131,6 +131,8 @@ bool pgView::DropObject(wxFrame *frame, ctlTree *browser, bool cascaded) wxString pgView::GetSql(ctlTree *browser) { + wxString withoptions = wxEmptyString; + if (sql.IsNull()) { bool IsMatViewFlag = false; @@ -141,7 +143,14 @@ wxString pgView::GetSql(ctlTree *browser) + wxT("\n\nCREATE OR REPLACE VIEW ") + GetQuotedFullIdentifier(); if (GetConnection()->BackendMinimumVersion(9, 2) && GetSecurityBarrier().Length() > 0) - sql += wxT(" WITH (security_barrier=") + GetSecurityBarrier() + wxT(")"); + withoptions += wxT("security_barrier=") + GetSecurityBarrier(); + if (GetConnection()->BackendMinimumVersion(9, 4) && GetCheckOption().Length() > 0) + { + if (withoptions.Length() > 0) + withoptions += wxT(", "); + withoptions += wxT("check_option=") + GetCheckOption(); + } + sql += wxT(" WITH (") + withoptions + wxT(")"); } else { @@ -548,6 +557,9 @@ void pgView::ShowTreeDetail(ctlTree *browser, frmMain *form, ctlListView *proper properties->AppendItem(_("With data?"), _("No")); } + if (GetConnection()->BackendMinimumVersion(9, 4)) + properties->AppendItem(_("Check Option"), GetCheckOption()); + if (!GetLabels().IsEmpty()) { wxArrayString seclabels = GetProviderLabelArray(); @@ -713,6 +725,11 @@ pgObject *pgViewFactory::CreateObjects(pgCollection *collection, ctlTree *browse wxT(", c.reloptions AS reloptions, tst.reloptions AS toast_reloptions \n") wxT(", (CASE WHEN c.reltoastrelid = 0 THEN false ELSE true END) AS hastoasttable\n"); } + if (collection->GetConnection()->BackendMinimumVersion(9, 4)) + { + sql += wxT(",\nsubstring(array_to_string(c.reloptions, ',') FROM 'check_option=([a-z]*)') AS check_option"); + } + sql += wxT("\n FROM pg_class c\n") @@ -746,6 +763,10 @@ pgObject *pgViewFactory::CreateObjects(pgCollection *collection, ctlTree *browse view->iSetAcl(views->GetVal(wxT("relacl"))); view->iSetDefinition(views->GetVal(wxT("definition"))); view->iSetMaterializedView(false); + if (collection->GetDatabase()->BackendMinimumVersion(9, 4)) + { + view->iSetCheckOption(views->GetVal(wxT("check_option"))); + } if (collection->GetDatabase()->BackendMinimumVersion(9, 1)) { diff --git a/pgadmin/ui/dlgView.xrc b/pgadmin/ui/dlgView.xrc index 5e4ed70..0b0f083 100644 --- a/pgadmin/ui/dlgView.xrc +++ b/pgadmin/ui/dlgView.xrc @@ -116,7 +116,7 @@ 2 5 5 - 1 + 2 1 @@ -134,6 +134,25 @@ 4 + + + + wxALIGN_CENTRE_VERTICAL|wxTOP|wxLEFT|wxRIGHT + 4 + + + + + No + Local + Cascaded + + + + wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT + 4 + + @@ -706,4 +725,4 @@ - \ No newline at end of file +