Issue Number: close #68035 Related feature: #68036 Doris reconstructs loaded Iceberg tables as BaseTable snapshot views. BaseTable implements SupportsDistributedScanPlanning with a default true result, so wrapping RESTTable loses its false override. The existing scan-entry guard then allows unsupported local planning. With restricted metadata credentials this surfaces as an S3 error; a separately documented simulated server residual demonstrates why ignoring the server plan can also change results. Check the original table before statement snapshot conversion, tracked-table publication, and cached TableOwner metadata serialization/weight estimation. Reject unsupported tables before local manifest access and release acquired table/catalog ownership on failure. Preserve the existing scan-entry guard and normal client-planned snapshot semantics. **Rejection includes metadata acquisition, not only SELECT scans.** DESC, SHOW CREATE TABLE, and INSERT target-column binding also fail for server-planned tables. Row-count and partition metadata paths using the same read acquisition are subject to this guard. The sharedWritableTable method itself is unchanged; this does not imply SQL INSERT remains supported. Add a dedicated native Iceberg REST fixture, pinned by multi-platform digest, to the existing Iceberg Compose stack. Keep the existing Spark/Postgres REST baseline. MinIO initialization creates a private test bucket and data-only credentials. The enabled regression requires a working /plan endpoint: an old or missing fixture fails instead of skipping. The fixture digest fixes the contents of an upstream `main` snapshot, built on 2026-04-29 from `b0df3ca01d61b2f7ae7143ac660c6b16e33b6e46` (recorded in the JAR build properties). This commit precedes the `apache-iceberg-1.11.0` tag by 105 commits; the image is not a release build. Moving `latest` cannot change the pinned contents. The retention risk is that the old manifest can become untagged and later be removed upstream, breaking fresh pulls. **Request to CI maintainers:** build a linux/amd64 + linux/arm64 fixture from the upstream `apache-iceberg-1.11.0` tag using the upstream shadowJar task and Dockerfile, and publish it as `doristhirdpartydocker/iceberg-rest-fixture:1.11.0`. Keep the current digest until that artifact exists; verify source/architectures and rerun this regression, then switch to the versioned image with its verified digest. Mirroring the current image into the Doris namespace is a retention fallback, but remains a snapshot. We do not assume the upstream release-image workflow will be repaired in time for this PR. The regression invokes the real /plan endpoint, verifies restricted data-file reads succeed and manifest access returns 403, and checks explicit Doris rejection for SELECT, metadata statements, INSERT, empty tables, and $files with cache enabled/disabled. Client-planned reads remain four rows before and after. No policy proxy is part of this Docker regression. Server-forced planning mode is additionally covered by HTTP RESTCatalog unit tests.
Doris Develop Environment based on docker
Preparation
-
Download the Doris code repo
$ cd /to/your/workspace/ $ git clone https://github.com/apache/doris.git $ cd doris $ git submodule update --init --recursiveYou can remove the
.gitdir indoris/to make the dir size smaller. So that the following generated docker image can be smaller. -
Copy Dockerfile
$ cd /to/your/workspace/ $ cp doris/docker/Dockerfile ./
After preparation, your workspace should like this:
.
├── Dockerfile
├── doris
│ ├── be
│ ├── bin
│ ├── build.sh
│ ├── conf
│ ├── DISCLAIMER-WIP
│ ├── docker
│ ├── docs
│ ├── env.sh
│ ├── fe
│ ├── ...
Build docker image
$ cd /to/your/workspace/
$ docker build -t doris:v1.0 .
dorisis docker image repository name andv1.0is tag name, you can change them to whatever you like.
Use docker image
This docker image you just built does not contain Doris source code repo. You need to download it first and map it to the container. (You can just use the one you used to build this image before)
$ docker run -it -v /your/local/path/doris/:/root/doris/ doris:v1.0
$ docker run -it -v /your/local/.m2:/root/.m2 -v /your/local/doris-DORIS-x.x.x-release/:/root/doris-DORIS-x.x.x-release/ doris:v1.0
Then you can build source code inside the container.
$ cd /root/doris/
$ sh build.sh
NOTICE
The default JDK version is openjdk 11, if you want to use openjdk 8, you can run the command:
$ alternatives --set java java-1.8.0-openjdk.x86_64
$ alternatives --set javac java-1.8.0-openjdk.x86_64
$ export JAVA_HOME=/usr/lib/jvm/java-1.8.0
The version of jdk you used to run FE must be the same version you used to compile FE.
Latest update time
2022-1-23