Rick, Concur with the ij problem, I was caught out by the ij script using DERBY_OPTS and picking up the security policy which left it with no permissions. Easy fix.
As for Derby version I’ve upgraded to Apache Derby Network Server - 10.13.1.1 and that partly fixed things, since before doing that the problem would not go away even with the security policy in place. Thanks for the help. Nick > On 20 Feb 2017, at 15:55, Rick Hillegas <rick.hille...@gmail.com> wrote: > > Hi Nicholas, > > I think that the ij permissions problem is a red herring. That problem arises > because ij is trying to call System.getProperties() but the security policy > does not grant property-reading privilege to derbytools.jar. > > Concerning your original problem: What strikes me as significant is your > observation that aggregation worked for a while and then broke. The only big > state change which occurs during aggregation is when the processing of a > large data set causes the engine to dump intermediate results to a temporary > file. Eventually, those results must be de-serialized from the temporary > file. It is possible that de-serialization can't instantiate your > user-defined aggregate without that extra permission. > > I am afraid that your environment confuses me, though. According to your > original message, you are running Derby 10.6.2.1. However, user-defined > aggregates were not introduced until Derby 10.10.1.1. > > I have created https://issues.apache.org/jira/browse/DERBY-6922 > <https://issues.apache.org/jira/browse/DERBY-6922> to investigate the problem > raised by this issue. > > Hope this helps, > -Rick > > On 2/20/17, 1:54 AM, nicholas walton wrote: >> >> Rick, >> >> Neither Netbeans nor ij dumped the stack, I’m afraid. >> >> The full message is >> >> Error code 30000, SQL state 38000: The exception >> 'java.security.AccessControlException: access denied >> ("java.lang.RuntimePermission" "accessClassInPackage.sun.reflect")' was >> thrown while evaluating an expression. >> Error code 99999, SQL state XJ001: Java exception: 'access denied >> ("java.lang.RuntimePermission" "accessClassInPackage.sun.reflect"): >> java.security.AccessControlException’. >> Line 1, column 1 >> >> Did get it working after a while with the security policy below, but ij will >> not now run complaining >> >> Exception in thread "main" java.security.AccessControlException: access >> denied ("java.util.PropertyPermission" "*" "read,write") >> at >> java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) >> at java.security.AccessController.checkPermission(AccessController.java:884) >> at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) >> at >> java.lang.SecurityManager.checkPropertiesAccess(SecurityManager.java:1262) >> at java.lang.System.getProperties(System.java:630) >> at org.apache.derby.impl.tools.ij.ij$1.run(Unknown Source) >> at org.apache.derby.impl.tools.ij.ij$1.run(Unknown Source) >> at java.security.AccessController.doPrivileged(Native Method) >> at org.apache.derby.impl.tools.ij.ij.initFromEnvironment(Unknown Source) >> at org.apache.derby.impl.tools.ij.utilMain.initFromEnvironment(Unknown >> Source) >> at org.apache.derby.impl.tools.ij.Main.<init>(Unknown Source) >> at org.apache.derby.impl.tools.ij.Main.getMain(Unknown Source) >> at org.apache.derby.impl.tools.ij.Main.mainCore(Unknown Source) >> at org.apache.derby.impl.tools.ij.Main.main(Unknown Source) >> at org.apache.derby.tools.ij.main(Unknown Source) >> >> ========================================================================================= >> >> // >> // Licensed to the Apache Software Foundation (ASF) under one or more >> // contributor license agreements. See the NOTICE file distributed with >> // this work for additional information regarding copyright ownership. >> // The ASF licenses this file to You under the Apache License, Version 2.0 >> // (the "License"); you may not use this file except in compliance with >> // the License. You may obtain a copy of the License at >> // >> // http://www.apache.org/licenses/LICENSE-2.0 >> <http://www.apache.org/licenses/LICENSE-2.0> >> // >> // Unless required by applicable law or agreed to in writing, software >> // distributed under the License is distributed on an "AS IS" BASIS, >> // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. >> // See the License for the specific language governing permissions and >> // limitations under the License. >> // >> >> // This template policy file gives examples of how to configure the >> // permissions needed to run a Derby network server with the Java >> // Security manager. >> // >> grant codeBase >> "file:///Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/db/lib/derby.jar >> >> <file:///Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/db/lib/derby.jar>" >> { >> // These permissions are needed for everyday, embedded Derby usage. >> // >> permission java.lang.RuntimePermission "createClassLoader"; >> permission org.apache.derby.security.SystemPermission "engine", >> "usederbyinternals"; >> >> // Next, the permission to read "derby.*" properties is granted to >> // derby.jar. This is necessary for the engine to read derby properties. >> permission java.util.PropertyPermission "derby.*", "read"; >> >> permission java.util.PropertyPermission "user.dir", "read"; >> >> // The next two properties are used to determine if the VM is 32 or 64 bit. >> // >> permission java.util.PropertyPermission "sun.arch.data.model", "read"; >> permission java.util.PropertyPermission "os.arch", "read"; >> permission java.io.FilePermission "${derby.system.home}","read"; >> permission java.io.FilePermission "${derby.system.home}${/}-", >> "read,write,delete"; >> >> // This permission lets a DBA reload the policy file while the server is >> // still running. The policy file is reloaded by invoking the >> // SYSCS_UTIL.SYSCS_RELOAD_SECURITY_POLICY() system procedure. >> // >> permission java.security.SecurityPermission "getPolicy"; >> >> // This permission lets you backup and restore databases to and from >> // arbitrary locations in your file system. >> // >> // This permission also lets you import/export data to and from arbitrary >> // locations in your file system. >> // >> // You may want to restrict this access to specific directories. >> // >> permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete"; >> >> // Permissions needed for JMX based management and monitoring. >> // >> // Allows this code to create an MBeanServer: >> // >> permission javax.management.MBeanServerPermission "createMBeanServer"; >> >> // Allows access to Derby's built-in MBeans, within the domain >> // org.apache.derby. Derby must be allowed to register and unregister >> these >> // MBeans. It is possible to allow access only to specific MBeans, >> // attributes or operations. To fine tune this permission, see the javadoc >> of >> // javax.management.MBeanPermission or the JMX Instrumentation and Agent >> // Specification. >> // >> permission javax.management.MBeanPermission >> "org.apache.derby.*#[org.apache.derby:*]", >> "registerMBean,unregisterMBean"; >> >> // Trusts Derby code to be a source of MBeans and to register these in the >> // MBean server. >> // >> permission javax.management.MBeanTrustPermission "register"; >> >> // getProtectionDomain is an optional permission needed for printing >> // classpath information to derby.log >> // >> permission java.lang.RuntimePermission "getProtectionDomain"; >> >> // >> // The following permission must be granted for Connection.abort(Executor) >> to >> // work. Note that this permission must also be granted to outer >> // (application) code domains. >> // >> permission java.sql.SQLPermission "callAbort"; >> >> // Needed by file permissions restriction system: >> // >> permission java.lang.RuntimePermission "accessUserInformation"; >> permission java.lang.RuntimePermission "getFileStoreAttributes"; >> >> // My additions >> permission java.lang.RuntimePermission "accessClassInPackage.sun.reflect"; >> }; >> >> >> >> grant codeBase >> "file:///Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/db/lib/derbynet.jar >> >> <file:///Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/db/lib/derbynet.jar>" >> { >> // These permissions lets the Network Server manage connections from >> clients. >> >> // Accept connections from any host. Derby is listening to the host >> interface >> // specified via the -h option to "NetworkServerControl start" on the >> command >> // line, via the address parameter to the >> // org.apache.derby.drda.NetworkServerControl constructor in the API or via >> // the property derby.drda.host; the default is localhost. You may want to >> // restrict allowed hosts, e.g. to hosts in a specific subdomain, >> // e.g. "*.example.com <http://example.com/>". >> permission java.net.SocketPermission "*", "accept"; >> >> // Allow the server to listen to the socket on the default port (1527). >> // If you have specified another port number with the -p option to >> // "NetworkServerControl start" on the command line, or with the portNumber >> // parameter to the NetworkServerControl constructor in the API, or with >> the >> // property derby.drda.portNumber, you should change the port number in the >> // permission statement accordingly. >> permission java.net.SocketPermission "localhost:1527", "listen"; >> >> // Needed for server tracing. >> // >> permission java.io.FilePermission >> "file:///Users/nwalton/.derby/dummy/traces${/}- >> <file:///Users/nwalton/.derby/dummy/traces$%7B/%7D->", >> "read,write,delete"; >> >> // Needed by file permissions restriction system: >> // >> permission java.lang.RuntimePermission "accessUserInformation"; >> permission java.lang.RuntimePermission "getFileStoreAttributes"; >> permission java.util.PropertyPermission "derby.__serverStartedFromCmdLine", >> "read, write"; >> >> // Needed to start the monitoring MBeans >> permission org.apache.derby.security.SystemPermission "engine", >> "usederbyinternals"; >> >> // JMX: Uncomment this permission to allow the ping operation of the >> // NetworkServerMBean to connect to the Network Server. >> // >> permission java.net.SocketPermission "*", "connect,resolve"; >> >> // Needed by sysinfo. The file permission is needed to check the existence >> of >> // jars on the classpath. You can limit this permission to just the >> locations >> // which hold your jar files. >> // >> // In this template file, this block of permissions is granted to >> // derbynet.jar under the assumption that derbynet.jar is the first jar >> file >> // in your classpath which contains the sysinfo classes. If that is not the >> // case, then you will want to grant this block of permissions to the first >> // jar file in your classpath which contains the sysinfo classes. Those >> // classes are bundled into the following Derby jar files: >> // >> // derbynet.jar >> // derby.jar >> // derbyclient.jar >> // derbytools.jar >> // >> permission java.util.PropertyPermission "user.*", "read"; >> permission java.util.PropertyPermission "java.home", "read"; >> permission java.util.PropertyPermission "java.class.path", "read"; >> permission java.util.PropertyPermission "java.runtime.version", "read"; >> permission java.util.PropertyPermission "java.fullversion", "read"; >> permission java.lang.RuntimePermission "getProtectionDomain"; >> permission java.io.FilePermission "<<ALL FILES>>", "read"; >> >> // My additions >> permission java.lang.RuntimePermission "accessClassInPackage.sun.reflect"; >> //permission java.net.SocketPermission "127.0.0.1:1527" "connect,resolve", >> }; >> >> >> >> >> Nick >> >>> On 19 Feb 2017, at 16:38, Rick Hillegas <rick.hille...@gmail.com >>> <mailto:rick.hille...@gmail.com>> wrote: >>> >>> Thanks for raising this issue, Nicholas. Can you include the full stack >>> trace for the error? The template policy may need to grant some additional >>> privilege to the engine jar file. It is also possible that you have run >>> into the following defect: https://issues.apache.org/jira/browse/DERBY-4354 >>> <https://issues.apache.org/jira/browse/DERBY-4354> >>> >>> Thanks, >>> -Rick >>> >>> On 2/17/17, 9:42 AM, nicholas walton wrote: >>>> >>>> Hi, >>>> >>>> I need to extend Java’s aggregate functions to include Median, using the >>>> code below >>>> >>>> import java.util.ArrayList; >>>> import java.util.Collections; >>>> import org.apache.derby.agg.Aggregator; >>>> >>>> public class median<V extends Comparable<V>> >>>> implements Aggregator<V,V,median<V>> >>>> { >>>> private ArrayList<V> _values; >>>> >>>> public median() {} >>>> >>>> public void init() { _values = new ArrayList<V>(); } >>>> >>>> public void accumulate( V value ) { _values.add( value ); } >>>> >>>> public void merge( median<V> other ) >>>> { >>>> _values.addAll( other._values ); >>>> } >>>> >>>> public V terminate() >>>> { >>>> Collections.sort( _values ); >>>> >>>> int count = _values.size(); >>>> >>>> if ( count == 0 ) { return null; } >>>> else { return _values.get( count/2 ); } >>>> } >>>> } >>>> >>>> To install I used >>>> >>>> CALL >>>> SQLJ.INSTALL_JAR('/Users/nwalton/Documents/Databases/derbyStats/dist/derbyStats.jar', >>>> 'NWALTON.median',0); >>>> CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY >>>> ('derby.database.classpath','NWALTON.median’); >>>> >>>> CREATE DERBY AGGREGATE "NWALTON"."MEDIAN" FOR DOUBLE RETURNS DOUBLE >>>> EXTERNAL NAME 'aggregates.median’ ; >>>> >>>> At first this works fine in a trigger or in plain SQL but after a while I >>>> get the following error >>>> >>>> Error code 30000, SQL state 38000: The exception >>>> 'java.security.AccessControlException: access denied >>>> ("java.lang.RuntimePermission" "accessClassInPackage.sun.reflect")' was >>>> thrown while evaluating an expression. >>>> Error code 99999, SQL state XJ001: Java exception: 'access denied >>>> ("java.lang.RuntimePermission" "accessClassInPackage.sun.reflect"): >>>> java.security.AccessControlException'. >>>> Line 1, column 1 >>>> >>>> I’ve Googled to no avail for an answer! Can anyone suggest a solution. I’m >>>> running OS X Sierra Apache Derby Network Server - 10.6.2.1 - (999685) >>>> under Java version 1.8.0_31-b13. >>>> >>>> Thanks in advance >>>> >>>> Nick >>> >> >