textureQueryLevels() in GLSL returns non-zero for an empty texture

If I read the spec correctly, textureQueryLevels() should return zero if the texture has no image specified. However in my test it returns 1 for both the default texture and a newly created texture with no image specified. Is that a driver bug?

Test program, which shows a red window on my computer (expecting green):

#include <cstdio>

#include <GL/glew.h>

#include <GL/freeglut.h>

GLuint program;
GLuint texture;

char const* vertex_shader_src =
	"#version 430 compatibility\n"
	"void main() { gl_Position = gl_Vertex; }\n"
	;

char const* fragment_shader_src =
	"#version 430 compatibility\n"
	"layout(binding = 0) uniform sampler2D texture0;\n"
	"void main() { gl_FragColor = textureQueryLevels(texture0) > 0 ? vec4(1.0, 0.0, 0.0, 1.0) : vec4(0.0, 1.0, 0.0, 1.0); }\n"
	;

void display()
{
	glClear(GL_COLOR_BUFFER_BIT);

	glUseProgram(program);
	glBindTexture(GL_TEXTURE_2D, texture);
	glBegin(GL_QUADS);
	glVertex2d(-1, -1);
	glVertex2d(+1, -1);
	glVertex2d(+1, +1);
	glVertex2d(-1, +1);
	glEnd();
	glBindTexture(GL_TEXTURE_2D, 0);
	glUseProgram(0);

	glutSwapBuffers();
	glutPostRedisplay();
}

int main(int argc, char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_ALPHA | GLUT_DEPTH | GLUT_STENCIL | GLUT_DOUBLE);
	glutInitWindowSize(1280, 720);

	glutCreateWindow("OpenGL Window");
	glewInit();

	GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
	glShaderSource(vertex_shader, 1, &vertex_shader_src, nullptr);
	glCompileShader(vertex_shader);

	GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
	glShaderSource(fragment_shader, 1, &fragment_shader_src, nullptr);
	glCompileShader(fragment_shader);

	program = glCreateProgram();
	glAttachShader(program, vertex_shader);
	glAttachShader(program, fragment_shader);
	glLinkProgram(program);

	GLchar log[1024];
	GLsizei logLen = 0;
	glGetProgramInfoLog(program, sizeof(log), &logLen, log);
	printf("%s\n", log);

	glGenTextures(1, &texture);
	printf("Texture ID: %d\n", (int)texture);

	glutDisplayFunc(display);
	glutMainLoop();

	return 0;
}

Thanks for the report. You’re right, it’s not working correctly.
Our OpenGL driver developers could reproduce this and the problem is understood.
It’s not possible to tell at this time when this is going to be solved in a future driver though.